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

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

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

【问题讨论】:

标签: function haskell operators prefix


【解决方案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)) 可以达到相同的目的。"
猜你喜欢
  • 2018-08-05
  • 2022-10-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多