Haskell 为什么';操作员部分的t`-`(负)工作?
根据位置,Haskell中的部分应用程序得到正确答案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
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))
也可以达到同样的目的