柯里减法
如果我们想要映射一个将范围的每个元素增加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带有negate和subtract ,分别是\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] ,也容易阅读。