减法的等价于(+1),因为(-1)被视为负数?

时间:2012-10-11 02:15:00

标签: haskell pointfree

  

可能重复:
  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

3 个答案:

答案 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 +)之类的内容。