galaxy-sixth-sensey - GHCの-Wtype-defaultsを解決するにはちゃんと型付けするしかないかなあ
2017/07/04
GHCの-Wtype-defaultsを解決するにはちゃんと型付けするしかないかなあ

Test.hs

main :: IO ()
main = print 10

このコードを-Wtype-defaults付きでコンパイルすると、以下の警告が出る。 (-Wtype-defaultsはGHC-8.0.2ではデフォルトで無効)

$ stack runghc -- -Wtype-defaults Test.hs

Test.hs:2:8: warning: [-Wtype-defaults]
    • Defaulting the following constraints to type ‘Integer’
        (Show a0) arising from a use of ‘print’ at Test.hs:2:8-15
        (Num a0) arising from the literal ‘10’ at Test.hs:2:14-15
    • In the expression: print 10
      In an equation for ‘main’: main = print 10
10

10が型推論で(Num a, Show a) => aに推論されているからだ。 GHCは10を最終的に単相型で型付けする必要がある……はずなので、デフォルトのIntegerとして型付けされていて、 このままだとパフォーマンスに影響が出る。(IntegerよりIntのが速い)

型を付けて解決する。

Test.hs

main :: IO ()
main = print (10 :: Int)

他にいい解決方法ないの?

参考ページ


この記事はこちらから修正リクエストを送ることができます。
GHCの-Wtype-defaultsを解決するにはちゃんと型付けするしかないかなあ - github
ゴミ箱ボタンの左にある、鉛筆ボタンを押してね!