7

遊んでみるghciと、次のような表現になりました。unlines . map (\(a,b) -> show a ++ " " ++ show b)

今、私がそれを介してそれをチェックすると、:t私は得ます:

> :t  unlines . map (\(a,b) -> show a ++ " " ++ show b)
unlines . map (\(a,b) -> show a ++ " " ++ show b)
  :: (Show a, Show a1) => [(a, a1)] -> String

まさに期待通りです。しかし、それをある名前に割り当てようとすると、元の署名よりも具体的な署名が得られます。

> let f = unlines . map (\(a,b) -> show a ++ " " ++ show b)
> :t f
f :: [((), ())] -> String

なぜこれが起こるのですか?

4

2 に答える 2

12

モノモーフィズムの制限により、フォーム (パラメーターなし) の定義にはモノx = ...モーフィック (つまり、非ポリモーフィック) 型が与えられます

これが起こらないようにするには、型シグネチャを定義に追加するか、 を使用してモノモーフィズムの制限を無効にします:set -XNoMonomorphismRestriction。これを.ghciファイルに追加して、GHCi の将来のバージョンでデフォルトで無効になるまで、起動時に自動的に実行されるようにすることができます。

于 2013-03-16T16:38:18.733 に答える
4

デフォルトのルール。

GHCi で入力すると、デフォルトの型を適用しようとします。IIRC、Num制約のあるものは picks Integer、 for Fractionalit picks Double、その他すべてのものは picks ()

これを Haskell のソースファイルに書いて GHCi にロードすれば、これは起こりません (私は信じています)。

default Intモジュールごとにデフォルトのルールを変更する、みたいなことも言えると思います。

于 2013-03-16T16:14:52.447 に答える