+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 中已经回答的那样,你可以使用函数negate
和subtract
来消除一元和二元-
函数之间的歧义。
【讨论】:
“否定是 Haskell 中唯一的前缀运算符”haskell.org/onlinereport/exps.html @mjg123,我认为在这里写“一元运算符”而不是“一元运算符”只会更难获得“它既是一元又是二元”的信息。因此,我想我会保持原样。 =D【参考方案2】:(-1)
是负数,正如其他人所指出的那样。减一函数是\x -> x-1
、flip (-) 1
或者实际上是(+ (-1))
。
-
在expression grammar 中被视为特殊情况。 +
不是,大概是因为正面文字不需要前导加号,允许它会导致更多混乱。
编辑:我第一次弄错了。 ((-) 1)
是函数“减一”,或者(\x -> 1-x)
。
【讨论】:
通常的“减一”函数就是subtract 1
【参考方案3】:
我必须写 (+(-1)) 还是有更好的方法?
我刚刚找到了一个叫做subtract
的函数,所以我也可以说subtract 1
。我觉得这很可读:-)
【讨论】:
+1subtract
专门用于部分。 Haskell 2010 / Expressions # Sections "因为 - 在语法中被特殊对待,(- exp)
不是一个部分,而是前缀否定的应用,如前一节所述。但是,在 Prelude 中定义了一个 subtract
函数,这样(subtract exp)
等同于不允许的部分。表达式 (+ (- exp))
可以达到相同的目的。"以上是关于+1 和 -1 的区别的主要内容,如果未能解决你的问题,请参考以下文章