次の式はすべて問題なく評価されます。
(+2) 1 -- 3
(*2) 1 -- 2
((-)2) 1 -- 1
(2-) 1 -- 1
(/2) 1 -- 0.5
(2/) 1 -- 2.0
しかし、これではありません:
(-2) 1 -- the inferred type is ambiguous
GHC は、推論された型があいまいであるというエラーをスローします。なんで?
次の式はすべて問題なく評価されます。
(+2) 1 -- 3
(*2) 1 -- 2
((-)2) 1 -- 1
(2-) 1 -- 1
(/2) 1 -- 0.5
(2/) 1 -- 2.0
しかし、これではありません:
(-2) 1 -- the inferred type is ambiguous
GHC は、推論された型があいまいであるというエラーをスローします。なんで?
かっこで囲まれた最初の 6 つの式はセクション、つまり 1 つの引数を取り、「中置演算子の欠落側に配置する」関数です (このhaskell.org wikiを参照)。対照的に、(-2)
is はfunctionではなく数値(マイナス 2) です。
λ> :t (-2)
(-2) :: Num a => a
あなたが書くなら
λ> (-2) 1
(-2)
(数値) を(これは不可能です)に適用しようとしているように見えますが1
、GHCi は次のように文句を言います:
Could not deduce (Num (a0 -> t))
arising from the ambiguity check for ‘it’
from the context (Num (a -> t), Num a)
bound by the inferred type for ‘it’: (Num (a -> t), Num a) => t
at <interactive>:3:1-6
The type variable ‘a0’ is ambiguous
When checking that ‘it’
has the inferred type ‘forall a t. (Num (a -> t), Num a) => t’
Probable cause: the inferred type is ambiguous
別の数値から減算する関数が必要な場合2
は、使用できます
(subtract 2)
その種類を比較すると、
λ> :t (subtract 2)
(subtract 2) :: Num a => a -> a
のそれに(-2)
(上記を参照)。
マイナス演算子を括弧で囲むと、2 つの引数を取る通常の (プレフィックス) 関数になります。したがって((-) 2)
、セクションではなく、部分的に適用される機能です。