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

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

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

4

3 回答 3

9

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

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

于 2011-03-06T11:36:49.077 回答
6

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

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

于 2011-03-06T12:01:29.107 回答
1

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

-在表达式语法中被视为特殊情况。+不是,大概是因为正面文字不需要前导加号,并且允许它会导致更多的混乱。

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

于 2011-03-06T11:39:28.143 回答