15

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

removeall = filter . (/=)

filter、、 の型から紙と鉛筆で計算する(/=)(.)、関数には の型があります。

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

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

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

タイプを明示的に指定しない限り(その場合は正常に機能します)。Haskell が関数の特定の型を推論するのはなぜですか?

4

2 に答える 2

28

Haskell が関数の特定の型を推論するのはなぜですか?

GHCi はtype defaultingを使用して、可能なセットからより具体的な型を推測します。これは、モノモーフィズムの制限を無効にすることで簡単に回避できます。

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]
于 2009-08-28T02:09:33.397 に答える
17

式に名前を割り当てない場合、型チェッカーは型のデフォルト化を回避するように見えることにも注意してください。

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
于 2009-08-28T07:09:47.193 に答える