Haskell中一元运算符的前缀形式

aXq*_*Xqd 3 haskell unary-operator ghci prefix-operator

在GHCi中:

  1. 序曲>(+3)2
    5
  2. 序曲>(*3)2
    6
  3. 前奏>(/ 3)2
    0.6666666666666666
  4. 前奏>( - 3)2
    没有实例(Num(t - > t1))
    来自文字':it =( - 3)23' at <interactive>:1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of

如何更正最后一个使其返回-1?

grd*_*dev 12

Haskell的语法不允许你这样使用-.请改用此subtract功能:

(subtract 3) 2
Run Code Online (Sandbox Code Playgroud)


Tra*_*own 7

作为grddev答案的脚注,这里是Haskell 98报告中的相关段落:

特殊形式-e表示前缀否定,Haskell中唯一的前缀运算符,并且是语法negate (e).二元-运算符不一定是指-Prelude中的定义 ; 它可能会被模块系统反弹.但是,一元- 将始终引用negate Prelude中定义的函数.-操作符的本地含义与一元否定之间没有联系.

当我第一次碰到它时,这让我很沮丧:我无法理解为什么操作员在这种情况下表现得如此不同:info (+),:info (-)看起来基本相同.

您可以使用subtract,如grddev建议的那样,或者您可以只定义一个新的中缀运算符:

Prelude> let (#) = (-)
Prelude> (# 3) 2
-1
Run Code Online (Sandbox Code Playgroud)

subtract 具有熟悉其他可能阅读您的代码的人的优点.