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