4

これがGHCiからの短いトランスクリプトです:

Prelude> :t read
read :: Read a => String -> a
Prelude> :t show
show :: Show a => a -> String
Prelude> :t show.read
show.read :: String -> String
Prelude> (show.read) "whales"
"*** Exception: Prelude.read: no parse

私が作曲するとき、GHCが「中間」タイプであることができると同時に可能であるいくつかの任意のタイプを選んだshowread私は推測することができるだけです。ReadShow

どのようにしてこのタイプを選択しましたか?それが何であるかを知る方法はありますか?

4

1 に答える 1

14

GHCiのデフォルトのルールでは、選択されたタイプは()です。Showこれは、インスタンスが要求された場合に選択されるデフォルトのタイプです。GHCiは()、一般的な制約、Integer数値または積分の制約、およびDouble分数/その他の実際の制約を選択します。これはHaskellの本質的なものによるものではありません。電卓として簡単に使用できるようにGHCiが実装された方法です。

実際にファイルにコードを入力してコンパイルした場合は、より厳密なGHCルールが適用され、中間タイプを解決できないというエラーが発生します。

もちろん、関数の1つにタイプを指定することにより、GHCに別のタイプを使用するように指示できます。

show . (read :: String -> Int)
于 2012-09-18T23:24:30.197 に答える