6

次の場合、正確には何が起こっているのでしょうか。

> let test = map show

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

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

以前はどうしてこれに気づかなかったのだろうか?show ではなく「map fromIntegral」で実際に問題が発生しました。私のコードは pointfree 形式ではコンパイルされませんが、eta リダクションなしでは問題なく動作します。

eta リダクションが Haskell コードの意味を変更できる場合の簡単な説明はありますか?

4

1 に答える 1

12

これはモノモーフィズムの制限であり、バインディングがパラメーターをとらない場合に適用され、そうでなければポリモーフィズムが原因ではない場合にバインディングを共有可能にすることを許可します。それを「一定の」ものとして扱います(したがって共有されます)。で無効にすることができghciます:set -XNoMonomorphismRestriction; これは、このような式を完全にポリモーフィックにすることが多い で役立ちghciます。(Haskell ソース ファイルで、最初の行を作成します。

 {-# LANGUAGE NoMonomorphismRestriction #-}

代わりは。)

于 2012-04-25T06:27:08.203 に答える