21

私はHaskellを学んでいて、非常に不可解な何かに出くわしたとき、ghciで遊んでいました。

まず、簡単な追加関数を作成します。

Prelude> let add x y = x + y

intsとfloatで動作することに注意してください。

Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8

次に、適用関数を作成します。これは同じです$(ただし、中置ではありません)。これは、追加時に何もしないように機能します。

Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8

さて、add'これは同じですadd'が使用して作成しapplyます:

Prelude> let add' = apply add
Prelude> add' 3 4
7
Prelude> add' 2.5 1.3

<interactive>:1:9:
    No instance for (Fractional Integer)
      arising from the literal `1.3' at <interactive>:1:9-11
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `add'', namely `1.3'
    In the expression: add' 2.5 1.3
    In the definition of `it': it = add' 2.5 1.3

ワット。

タイプは次のとおりです。

Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add'
add' :: Integer -> Integer -> Integer
Prelude> 

なぜとはadd'異なるタイプなのapply addですか?

これはghciの奇妙なことですか、それともHaskell一般に当てはまりますか?(そして、どうすれば違いがわかりますか?)

4

1 に答える 1

18

これは単相制限です。単純なパターンバインディング(名前のみ、関数の引数なし)を使用し、型シグネチャを使用せずに値を定義すると、単形型が取得されます。すべての型変数は、デフォルトのルールに従って明確化されようとします。それが成功しない場合は、型エラーが発生します。

この場合、Num制約付き型変数はデフォルトで。になりIntegerます。

単相制限をオフにすることができます

ghci> :set -XNoMonomorphismRestriction

または-XnoMonomorphismRestrictionコマンドラインのフラグを使用します。

于 2012-06-12T19:34:20.187 に答える