2012-04-25 5 views
5

正確には次のようなことが起こっていますか?ηの削減によって関数の型が変更できるのはいつですか?

> let test = map show 

> :t test 
test :: [()] -> [String] 

> :t (map show) 
(map show) :: Show a => [a] -> [String] 

私はこれに気付かなかったのですか?私は実際に "map fromIntegral"を表示するのではなく、問題を抱えていました。私のコードはpointfree形式ではコンパイルされませんが、ηの削減なしでうまく動作します。

エスカ削減がHaskellコードの意味を変えることができるのは簡単な説明はありますか?

答えて

11

monomorphism restrictionこれは、バインディングでパラメータが取られていない場合に適用され、それ以外の場合は多態性に起因しないバインディングを共有可能にします。あなたはそれを何か「不変」なものとして扱いたいと思っています。 ghciには:set -XNoMonomorphismRestrictionで無効にすることができます。 ghciでは多くの場合、このような式を完全に多態性にすることを意図しています。 (Haskellのソースファイルでは、最初の行の代わりに

{-# LANGUAGE NoMonomorphismRestriction #-} 

を作る。)

+0

は、WOW、私は申し訳ありませんが、知られている必要があります。私は言語プラグマを試したこともありましたが、ハッシュ記号を含めるのを忘れていました。そして、GHCは "考えられる原因"についていつものことを言っていませんでした。 – sacheie

+9

正確には、GHCiの拡張デフォルトルールと組み合わせた単相性制限です。 – sepp2k

関連する問題