26

可能重复:
柯里化减法

我开始了我的第一个 haskell 项目,它不是从教程开始的,当然我偶然发现了最简单的东西。

我有以下代码:

moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)

我花了一些时间来理解为什么我的代码无法编译:我使用了 (-1),这被视为负数。将减号括起来并没有帮助,因为它是它的前缀并使 1 成为它的第一个参数。

简而言之,这个免费版本是什么?

dec :: Num a => a -> a
dec x = x - 1
4

3 回答 3

30

我相信您想要命名方便的subtractfunction,它的存在正是您发现的原因:

subtract :: Num a => a -> a -> a

一样flip (-)

因为-在 Haskell 语法中被特殊对待,(- e)不是一个节,而是前缀否定的一种应用。但是,(subtract exp)相当于不允许的部分。

如果您想在不使用类似 的函数的情况下编写它subtract,您可以使用flip (-),如Prelude文档所述。但这……有点丑。

于 2012-10-11T02:21:57.980 回答
6

如果上述subtract内容过于冗长,您可以尝试类似(+ (-1))or (-1 +)

于 2012-10-11T02:24:27.180 回答
4

您可以使用该subtract功能(在标准前奏曲中)。

moveDn y = modifyMVar_ y $ return . (subtract 1)

您还可以使用翻转来重新排序所采用的参数-

moveDn y = modifyMVar_ y $ return . (flip (-) 1)
于 2012-10-11T02:22:20.547 回答