2012-06-12 10 views
21

私はHaskellのを学んでいる、と私は非常に不可解な何かに出くわしたとき、私はGHCiの中で遊んでました。このghciセッションのタイプでは何が起こっていますか?

まず、簡単な追加機能を作成します。それはint型で動作し、浮くこと

Prelude> let add x y = x + y 

注:

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 

[OK]を、今add'と同じですがapplyを使用しているadd'します

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でこれは本当でしょうか? (そして、どのように私は違いを見分けることができますか?)

+13

はできるだけ早く私が聞くと「私はGHCiの中で遊んでいたと私は奇妙な何かを見て、」私が思うに、「単相性制限」 – amindfv

答えて

18

それはMonomorphism restrictionです。単純なパターン・バインディング(名前だけで、関数の引数なし)とタイプ・シグネチャなしで値を定義すると、それは単形型を取得します。どのタイプ変数もdefaulting rulesに従って曖昧さを除去しようとしますが、成功しないとタイプエラーが発生します。この場合

は、Num拘束型変数がIntegerにデフォルト設定されます。

あなたは

ghci> :set -XNoMonomorphismRestriction 

またはコマンドラインで-XnoMonomorphismRestrictionフラグ付きで単相性制限をオフにすることができます。

関連する問題