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

时间:2010-08-04 14:05:51

标签: haskell ghci unary-operator prefix-operator

在GHCi中:

  
      
  1. 前奏> (+3)2
      5
  2.   
  3. 前奏> (* 3)2
      6
  4.   
  5. 前奏> (/ 3)2
      0.6666666666666666
  6.   
  7. 前奏> (-3)2
      没有(Num(t - > t1))的实例    由文字3' 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
    it'产生:it =( - 3)2
  8.   

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

4 个答案:

答案 0 :(得分:12)

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

(subtract 3) 2

答案 1 :(得分:7)

作为grddev's answer的注脚,这里是Haskell 98 Report的相关段落:

  

特殊形式-e表示前缀   否定,唯一的前缀运算符   Haskell,是negate (e)的语法。二进制-运算符没有   必然是指的定义   前奏-;它可能会被模块系统反弹。但是,一元-   将始终引用negate   Prelude中定义的函数。那里   本地意义之间没有联系   -运算符和一元否定。

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

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

Prelude> let (#) = (-)
Prelude> (# 3) 2
-1

subtract的优点是可以阅读您的代码的其他人熟悉。

答案 2 :(得分:1)

你可以做到

(-) 3 2

但是这将给你1.要获得-1,你需要将3绑定到 - 的第二个参数,你可以使用

flip (-) 3 2

答案 3 :(得分:0)

如果您打算保持原始形状,可以随时添加否定词:

(+ -3)

它不漂亮,但它更适合你的模式。