6

在 GHCi 中:

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

4

4 回答 4

14

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

(subtract 3) 2
于 2010-08-04T14:11:35.247 回答
9

作为grddev 回答的脚注,以下是Haskell 98 报告中的相关段落:

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

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

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

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

subtract具有对可能阅读您的代码的其他人熟悉的优势。

于 2010-08-04T14:47:04.343 回答
3

你可以做

(-) 3 2

但这会给你 1。要拥有 -1,你需要将 3 绑定到 - 的第二个参数,你可以使用

flip (-) 3 2
于 2010-08-04T14:22:50.957 回答
1

如果您打算保持原始形状,则可以随时添加负数:

(+ -3)

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

于 2010-08-05T00:29:27.483 回答