+1 和 -1 的区别

Posted

技术标签:

【中文标题】+1 和 -1 的区别【英文标题】:The difference between +1 and -1 【发布时间】:2011-07-09 18:32:16 【问题描述】:
> :t (+1)
(+1) :: Num a => a -> a

> :t (-1)
(-1) :: Num a => a

为什么第二个不是函数?我必须写(+(-1))还是有更好的方法?

【问题讨论】:

可能重复:***.com/questions/4454559/currying-subtraction 【参考方案1】:

这是因为(-1) 被解释为负数,而(+1) 被解释为柯里化函数(\x->1+x)

在 haskell 中,(a **)(**) a 的语法糖,(** a)(\x -> x ** a)。但是(-) 是一种特殊情况,因为它既是一元运算符(否定)又是二元运算符(减号)。因此,这种语法糖不能在这里明确应用。当你想要(\x -> a - x) 时,你可以写(-) a,并且正如Currying subtraction 中已经回答的那样,你可以使用函数negatesubtract 来消除一元和二元- 函数之间的歧义。

【讨论】:

“否定是 Haskell 中唯一的前缀运算符”haskell.org/onlinereport/exps.html @mjg123,我认为在这里写“一元运算符”而不是“一元运算符”只会更难获得“它既是一元又是二元”的信息。因此,我想我会保持原样。 =D【参考方案2】:

(-1) 是负数,正如其他人所指出的那样。减一函数是\x -> x-1flip (-) 1 或者实际上是(+ (-1))

- 在expression grammar 中被视为特殊情况。 + 不是,大概是因为正面文字不需要前导加号,允许它会导致更多混乱。

编辑:我第一次弄错了。 ((-) 1) 是函数“减一”,或者(\x -> 1-x)

【讨论】:

通常的“减一”函数就是subtract 1【参考方案3】:

我必须写 (+(-1)) 还是有更好的方法?

我刚刚找到了一个叫做subtract的函数,所以我也可以说subtract 1。我觉得这很可读:-)

【讨论】:

+1 subtract 专门用于部分。 Haskell 2010 / Expressions # Sections "因为 - 在语法中被特殊对待,(- exp) 不是一个部分,而是前缀否定的应用,如前一节所述。但是,在 Prelude 中定义了一个 subtract 函数,这样(subtract exp) 等同于不允许的部分。表达式 (+ (- exp)) 可以达到相同的目的。"

以上是关于+1 和 -1 的区别的主要内容,如果未能解决你的问题,请参考以下文章