可能重复:
Currying subtraction
我开始了第一个不是来自教程的haskell项目,当然我偶然发现了最简单的东西。
我有以下代码:
moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)
我花了一些时间来理解为什么我的代码不能编译:我曾经使用过(-1)这被认为是负面代码。将减号括起来并没有帮助,因为它为它添加前缀并使其成为第一个参数。
简而言之,这点的免费版本是什么?
dec :: Num a => a -> a
dec x = x - 1
答案 0 :(得分:26)
我相信你想要the conveniently-named subtract
function,这完全是你发现的原因所在:
subtract :: Num a => a -> a -> a
与
flip (-)
相同。因为
-
在Haskell语法中被特别处理,(- e)
不是一个部分,而是前缀否定的应用。但是,(subtract exp)
等同于不允许的部分。
如果您想在不使用像subtract
这样的函数的情况下编写无点编辑,可以使用flip (-)
,如Prelude
文档所述。但那......有点难看。
答案 1 :(得分:4)
您可以使用subtract
功能(位于标准前奏中)。
moveDn y = modifyMVar_ y $ return . (subtract 1)
您还可以使用“翻转”重新排序-
所需的参数。
moveDn y = modifyMVar_ y $ return . (flip (-) 1)
答案 2 :(得分:2)
如果上述subtract
过于冗长,您可以尝试(+ (-1))
或(-1 +)
之类的内容。