以下所有表达式都经过评估而不会发生意外事故:
(+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抛出一些关于推断类型不明确的错误。为什么呢?
答案 0 :(得分:7)
这些带括号的表达式中的每一个,但(-2)
(编辑:和((-) 2)
)都是部分,即带有一个参数的函数,"将它放在丢失的中缀运营商的一面" (见haskell.org wiki)。
(-2)
不是功能,而是数字(否定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)
不是一个部分,而是一个部分应用的函数。