优雅地在ruby中实现'map(+1)list'

Sho*_* Ya 6 ruby

标题中的短代码在Haskell中,它做的事情就像

list.map {|x| x + 1}
Run Code Online (Sandbox Code Playgroud)

在红宝石.

虽然我知道这种方式,但我想知道的是,是否有更优雅的方式在Haskell中实现同样的东西.

我非常喜欢to_proc红宝石中的快捷方式,就像这种形式:

[1,2,3,4].map(&:to_s)
[1,2,3,4].inject(&:+)
Run Code Online (Sandbox Code Playgroud)

但这只接受Proc和方法之间完全匹配的参数编号.

我正在尝试寻找一种允许将一个或多个参数额外传递到Proc中的方法,而不使用像第一次演示那样无用的临时块/变量.

我想这样做:

[1,2,3,4].map(&:+(1))
Run Code Online (Sandbox Code Playgroud)

红宝石有这样的举止吗?

mu *_*ort 7

如果您只想添加一个,那么您可以使用以下succ方法:

>> [1,2,3,4].map(&:succ)
=> [2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

如果你想添加两个,你可以使用lambda:

>> add_2 = ->(i) { i + 2 }
>> [1,2,3,4].map(&add_2)
=> [3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

对于任意值,您可以使用构建lambdas的lambda:

>> add_n = ->(n) { ->(i) { i + n } }
>> [1,2,3,4].map(&add_n[3])
=> [4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

您还可以使用lambda生成方法:

>> def add_n(n) ->(i) { i + n } end
>> [1,2,3,4].map(&add_n(3))
=> [4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)


Jos*_*Lee 5

使用ampex gem,它允许您使用方法X构建任何proc一个变量.以下是其规范中的一个示例:

["a", "b", "c"].map(&X * 2).should == ["aa", "bb", "cc"]
Run Code Online (Sandbox Code Playgroud)