15

私はHaskellを始めています...私はHaskellに型を決定させるという2つの異なる方法で次の自明な関数を書こうとしました、そして型システムはそれぞれの場合で何か違うことをします。その振る舞いの説明は何ですか?

Prelude> let f x = 2 * x
Prelude> let g = (2*)
Prelude> :info f
f :: Num a => a -> a    -- Defined at <interactive>:1:5
Prelude> :info g
g :: Integer -> Integer     -- Defined at <interactive>:1:5

ありがとう!

4

3 に答える 3

12

これは、単型性制限として知られています。

基本的に、型シグネチャを指定しない限り、次のように見えるトップレベルのバインディングx =が強制的に非ポリモーフィックであることを意味します。引数を持つバインディング、つまりf x =影響を受けません。この制限が存在する理由の詳細については、リンクを参照してください。

通常、制限が適用されるとエラー メッセージが表示されますが、この場合、GHCi は型のデフォルト設定を使用して型を に変更できNum a => aますInteger

それをかわす最も簡単な方法は、明示的な型シグネチャを使用するか、

{-# LANGUAGE NoMonomorphismRestriction #-}

をモジュールの先頭に追加するか、GHCi を で実行し-XNoMonomorphismRestrictionます。

于 2011-05-19T01:03:21.907 に答える
1

の定義はgその引数に明示的に名前を付けていないため、単相性の制限に遭遇し、ポリモーフィックになることを妨げg、(この場合) GHC のデフォルトを にしますInteger

于 2011-05-19T01:03:16.323 に答える