Currying减法

Mic*_*ohl 48 haskell coding-style

如果我们想映射一个增加范围的每个元素的函数,我们可以写

map (\x -> x + 1) [1..5]
Run Code Online (Sandbox Code Playgroud)

但我猜大多数人都会选择

map (+1) [1..5]
Run Code Online (Sandbox Code Playgroud)

代替.但这显然不适用于(-1),因为那是负面的.

所以首先想到的是

map (+(-1)) [1..5]
Run Code Online (Sandbox Code Playgroud)

考虑到Prelude(x - y = x + negate y)中如何定义减法,这是有意义的,但对我来说看起来有点奇怪.然后我想出了

map (flip (-) 1) [1..5]
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来更好,但可能有点太复杂了.

现在我知道这没什么大不了的,但我想知道我是否错过了一个更明显的方法来写这个?如果没有,您更喜欢哪两种方式?我真的只是问,因为通常这样的小细节会让你的代码更加惯用,因此对于那些必须阅读它的开发人员来说也是如此.

现在我得到了几个答案,我认为我最喜欢的是

map (subtract 1) [1..5]
Run Code Online (Sandbox Code Playgroud)

其次是

map pred [1..5]
Run Code Online (Sandbox Code Playgroud)

主要是因为第一个是非常明确的,没有人需要猜测/查找是什么pred意思(前任).

Ano*_*on. 43

您可以使用该subtract功能,而不是-如果您想要右截面减法:

map (subtract 1) [1..5]
Run Code Online (Sandbox Code Playgroud)


Has*_*ant 9

既然-是中缀减法和前缀否定,则不能使用 (*x)(其中*是中缀运算符和xa值)语法-.幸运的是,前奏带有negatesubtract,这是\x -> -x\x y -> y-x分别,所以你需要在两者之间进行区分你可以使用这些.