在GHCi中:
- 前奏> (+3)2
5- 前奏> (* 3)2
6- 前奏> (/ 3)2
0.6666666666666666- 前奏> (-3)2
醇>
没有(Num(t - > t1))的实例 由文字3' at <interactive>:1:2
it'产生:it =( - 3)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?
答案 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)
它不漂亮,但它更适合你的模式。