标题中的短代码在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)
红宝石有这样的举止吗?
如果您只想添加一个,那么您可以使用以下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)
使用ampex gem,它允许您使用方法X构建任何proc一个变量.以下是其规范中的一个示例:
["a", "b", "c"].map(&X * 2).should == ["aa", "bb", "cc"]
Run Code Online (Sandbox Code Playgroud)