【发布时间】:2011-07-09 18:32:16
【问题描述】:
> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
为什么第二个不是函数?我必须写(+(-1))还是有更好的方法?
【问题讨论】:
标签: function haskell operators prefix
> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
为什么第二个不是函数?我必须写(+(-1))还是有更好的方法?
【问题讨论】:
标签: function haskell operators prefix
这是因为(-1) 被解释为负数,而(+1) 被解释为柯里化函数(\x->1+x)。
在 haskell 中,(a **) 是 (**) a 的语法糖,(** a) 是 (\x -> x ** a)。但是(-) 是一种特殊情况,因为它既是一元运算符(否定)又是二元运算符(减号)。因此,这种语法糖不能在这里明确应用。当你想要(\x -> a - x) 时,你可以写(-) a,并且正如Currying subtraction 中已经回答的那样,你可以使用函数negate 和subtract 来消除一元和二元- 函数之间的歧义。
【讨论】:
(-1) 是负数,正如其他人所指出的那样。减一函数是\x -> x-1、flip (-) 1 或者实际上是(+ (-1))。
- 在expression grammar 中被视为特殊情况。 + 不是,大概是因为正面文字不需要前导加号,允许它会导致更多混乱。
编辑:我第一次弄错了。 ((-) 1) 是函数“减一”,或者(\x -> 1-x)。
【讨论】:
subtract 1
我必须写 (+(-1)) 还是有更好的方法?
我刚刚找到了一个叫做subtract的函数,所以我也可以说subtract 1。我觉得这很可读:-)
【讨论】:
subtract 专门用于部分。 Haskell 2010 / Expressions # Sections "因为 - 在语法中被特殊对待,(- exp) 不是一个部分,而是前缀否定的应用,如前一节所述。但是,在 Prelude 中定义了一个 subtract 函数,这样(subtract exp) 等同于不允许的部分。表达式 (+ (- exp)) 可以达到相同的目的。"