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

Nir*_*iel 23 haskell pointfree

可能重复:
Currying减法

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

我有以下代码:

moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)
Run Code Online (Sandbox Code Playgroud)

我花了一些时间来理解为什么我的代码不能编译:我曾经使用过(-1)这被认为是负面的.将减号括起来并没有帮助,因为它为它添加前缀并使其成为第一个参数.

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

dec :: Num a => a -> a
dec x = x - 1
Run Code Online (Sandbox Code Playgroud)

C. *_*ann 27

我相信你想要一个方便命名的subtract功能,它的存在正是你发现的原因:

subtract :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

同样的flip (-).

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

如果你想在不使用类似函数的情况下编写pointfree subtract,可以使用flip (-),如Prelude文档所述.但那......有点难看.


Fix*_*num 6

如果上面提到subtract的太冗长,你可以尝试像(+ (-1))或 之类的东西(-1 +)

  • 由于你的数字似乎是 `Enum` 的实例,你也可以使用 `succ` 和 `pred` 代替。 (6认同)
  • 这具有使我的两行代码对称的优点,因为 (+1) 和 (减 1) 并排看起来不太好。但是,这实际上并没有调用 (-)。当然,这对 Num 来说完全没问题,但是如果我使用的是无效的集合:将元素 -1 添加到集合与删除元素 1 不同。减法更通用,但我会使用您的建议. 但是,我必须接受对这个问题使用减法或翻转,因为它是一个更直接的答案。 (2认同)