質問

この質問はこれに触発されたものです 答え 別の質問では、次のように定義された関数を使用して、リストから出現するすべての要素を削除できることを示しています。

removeall = filter . (/=)

鉛筆と紙を使って、 filter, (/=) そして (.), 、関数の型は次のとおりです。

removeall :: (Eq a) => a -> [a] -> [a]

これはまさに契約に基づいて期待されるものです。ただし、GHCi 6.6 では、

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

型を明示的に指定しない限り (その場合は正常に動作します)。Haskell が関数に対してそのような特定の型を推論するのはなぜですか?

役に立ちましたか?

解決

Haskell が関数に対してそのような特定の型を推論するのはなぜですか?

GHCiが使用しているのは デフォルトのタイプ, 、可能なセットからより具体的な型を推測します。無効にすることでこれを簡単に回避できます 単型性制限,

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]

他のヒント

式に名前を割り当てないと、typechecker は型のデフォルト化を回避するようであることにも注目してください。

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top