根据位置,Haskell中的部分应用程序得到了正确的答案.
Prelude> (/2) 10
5.0
Prelude> (2/) 10
0.2
Prelude> (+3) 10
13
Prelude> (3+) 10
13
Run Code Online (Sandbox Code Playgroud)
但是,对于 - 运算符,我得到了一个错误,(-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
Run Code Online (Sandbox Code Playgroud)
如何7在这个例子中解决这个问题?
Zet*_*eta 21
使用subtract.-是Haskell中唯一的运算符,它出现在前缀和二进制中缀变体中:
let a = -3 -- prefix variant
let b = (-3) -- also prefix variant!
let c = 4 - 3 -- binary variant
Run Code Online (Sandbox Code Playgroud)
因此,你必须使用(subtract 3) 10.另见Haskell 2010报告中的第3.4节(强调我的):
特殊形式
-e表示前缀否定,Haskell中唯一的前缀运算符,并且是语法negate (e).二元-运算符不一定是指-Prelude中的定义; 它可能会被模块系统反弹.但是,一元-将始终引用negatePrelude中定义的函数.-操作符的本地含义与一元否定之间没有联系.前缀否定
-与Prelude中定义的中缀运算符具有相同的优先级(参见表4.1).因为e1-e2解析为二元运算符的中缀应用程序,所以-必须编写e1(-e2)替代解析.类似地,(-)是语法(\ x y -> x-y),与任何中缀运算符一样,并且不表示(\ x -> -x)- 必须使用negate它.
和第3.5节结束(再次,重点煤矿):
因为
-在语法中特别处理,(- exp)不是一个部分,而是前缀否定的应用,如上一节所述.然而,有一个subtract在前奏定义的函数,使得(subtract exp)等效于禁止部.表达式(+ (- exp))可以起到同样的作用.