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