柯里减法

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

map (\x -> x + 1) [1..5] 

但我想大多数人只会去

 map (+1) [1..5] 

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

所以首先想到的是

 map (+(-1)) [1..5] 

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

 map (flip (-) 1) [1..5] 

这对我来说好像不错,但也许有点太复杂了。

现在我知道这没有什么大不了的,但是我想知道如果我错过了一个更明显的写法呢? 如果不是,你会select哪两种方式? 我真的只是问,因为经常是这样的小细节,使您的代码更习惯,因此需要阅读它的其他开发人员愉快。

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

 map (subtract 1) [1..5] 

其次是

 map pred [1..5] 

主要是因为第一个是非常明确的,没有人需要猜测/查找pred含义(前任)。

你可以使用subtract函数代替-如果你想要右节减法:

 map (subtract 1) [1..5] 

由于-既是中缀减法又是前缀否定,因此不能使用(*x) (其中*是中缀运算符和xa值)语法。 幸运的是Prelude带有negatesubtract ,分别是\x -> -x\xy -> yx ,以便您可以使用那些需要区分两者的地方。

我不喜欢subtract因为它是令人困惑的倒退。 我build议

 minus :: Num n => n -> n -> n minus = (-) infixl 6 `minus` 

那么你可以写

 map (`minus` 1) [1..5] 

我认为map (\x -> x - 1) [1..5]更好地传达了程序员的意图,因为毫无疑问,什么是从什么中减去的。 我也find你的第一个解决scheme, map (+(-1)) [1..5] ,也容易阅读。