【发布时间】:2011-05-26 04:04:19
【问题描述】:
如果我们想映射一个函数,将范围内的每个元素都加 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]
这对我来说看起来更好,但可能有点太复杂了。
现在我知道这没什么大不了的,但我想知道我是否错过了一种更明显的写法?如果不是,您更喜欢这两种方式中的哪一种?我真的只是在问,因为通常是这样的小细节使您的代码更加惯用,因此对于必须阅读它的其他开发人员来说是愉快的。
解决方案
现在我得到了几个答案,我认为我个人最喜欢的是
map (subtract 1) [1..5]
紧随其后
map pred [1..5]
主要是因为第一个非常明确,没有人需要猜测/查找pred 的含义(前身)。
【问题讨论】:
-
一个小提示:问题不是柯里化,而是操作符部分的语法。
(-) 1是一种(在语法上有效)部分应用 curried-函数的方法。 -
我一直在为此苦苦挣扎,但想不出更好的办法。
map ((-) 1) [1..5]也不起作用,因此带有翻转的版本。 -
如果它们是整数,而你只想减1,为什么不
map pred -
@Grazer 因为我对此一无所知,所以我是否遗漏了一些明显的问题。
标签: haskell coding-style