Haskell 为什么';操作员部分的t`-`(负)工作?

Haskell 为什么';操作员部分的t`-`(负)工作?,haskell,Haskell,根据位置,Haskell中的部分应用程序得到正确答案 Prelude> (/2) 10 5.0 Prelude> (2/) 10 0.2 Prelude> (+3) 10 13 Prelude> (3+) 10 13 然而,对于-operator,我得到了一个(-3)错误,因为Haskell(似乎)将其解释为一个值-3,而不是部分应用程序 Prelude> (-3) 10 <interactive>:4:1: Could not deduce

根据位置,Haskell中的部分应用程序得到正确答案

Prelude> (/2) 10
5.0
Prelude> (2/) 10
0.2
Prelude> (+3) 10
13
Prelude> (3+) 10
13
然而,对于-operator,我得到了一个
(-3)
错误,因为Haskell(似乎)将其解释为一个值
-3
,而不是部分应用程序

Prelude> (-3) 10

<interactive>:4:1:
    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>:4:1-7
    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
前奏曲>(-3)10
:4:1:
无法推断(Num(a0->t))
由“it”的歧义检查引起
从上下文(Num(a->t),Num a)
由“it”的推断类型绑定:(Num(a->t),Num a)=>t
时间:4:1-7
类型变量“a0”不明确
当检查“it”时
具有所有t的推断类型。(Num(a->t),Num a)=>t'
可能原因:推断的类型不明确
在本例中,如何解决此问题以获得
7

使用
-
是Haskell中唯一一个同时出现在前缀和二进制中缀变体中的运算符:

let a = -3     -- prefix  variant
let b = (-3)   -- also prefix variant!
let c = 4 - 3  -- binary variant
因此,您必须使用
(减法3)10
。另见(我的重点):

特殊形式
-e
表示前缀否定,它是Haskell中唯一的前缀运算符,是
否定(e)
的语法。二进制
-
运算符不一定引用前奏中
-
的定义;它可能会被模块系统反弹。但是,一元
-
总是指前奏曲中定义的
否定
函数。
-
运算符的局部含义与一元否定之间没有联系

前缀否定与前奏中定义的中缀运算符
-
具有相同的优先级(见表4.1)。由于
e1-e2
解析为二进制运算符
-
的中缀应用程序,因此必须编写
e1(-e2)
以进行替代解析。类似地,
(-)
(\x y->x-y)
的语法,与任何中缀运算符一样,并不表示
(\x->-x)
-必须使用
否定

并得出结论(再次强调我的观点):

由于
-
在语法中被特别处理,
(-exp)
不是一个节,而是前缀否定的应用,如前一节所述。但是,前奏曲中定义了
减法
功能,因此
(减法exp)
相当于不允许的部分。表达式
(+(-exp))
也可以达到同样的目的