为什么一元减运算符在这个表达式中有问题:( - 2)1?

时间:2015-03-06 00:20:26

标签: haskell infix-operator

以下所有表达式都经过评估而不会发生意外事故:

(+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抛出一些关于推断类型不明确的错误。为什么呢?

1 个答案:

答案 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)的那个(见上文)。


术语附录(在OP编辑之后)

将减号运算符括号将其转换为带有两个参数的普通(前缀)函数;因此((-) 2)不是一个部分,而是一个部分应用的函数。