> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
为什么第二个不是功能?我必须写(+(-1))
还是有更好的方法?
答案 0 :(得分:9)
这是因为(-1)
被解释为否定值,但(+1)
被解释为curried函数(\x->1+x)
。
在haskell中,(a **)
是(**) a
的语法糖,而(** a)
是(\x -> x ** a)
。但是(-)
是一种特殊情况,因为它既是一元运算符(negate)又是二元运算符(减号)。因此,这种语法糖不能在这里明确地应用。如果您需要(\x -> a - x)
,可以撰写(-) a
,并且如Currying subtraction中已经回答的那样,您可以使用negate
和subtract
函数来消除一元之间的歧义和二进制-
函数。
答案 1 :(得分:6)
我必须写(+( - 1))还是有更好的方法?
我刚刚找到了一个名为subtract
的函数,所以我也可以说subtract 1
。我觉得这很可读: - )
答案 2 :(得分:1)
(-1)
是否定的。减去一个函数是\x -> x-1
,flip (-) 1
或者(+ (-1))
。
-
被视为expression grammar中的特例。 +
不是,可能是因为积极的文字不需要领先加上并允许它会导致更多的混乱。
编辑:我第一次弄错了。 ((-) 1)
是“从一个减去”的函数,或(\x -> 1-x)
。