gpt4 book ai didi

ruby - 在 Ruby 中乱序柯里化(Currying)

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:20 29 4
gpt4 key购买 nike

在 Ruby 中,有没有一种方法可以将函数参数的顺序打乱他们最初是宣布的?

这里有一个非常简单的例子来说明我的意思:

# Example data, an array of arrays
list = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34],
[41, 42, 43, 44]
]

# Declare a simple lambda
at = ->(arr, i) { arr[i] }

返回第一个数组的第一个元素,第二个元素第二个数组等。你可以只使用#with_index:

# Supply the lambda with each array, and then each index
p list.map.with_index(&at)

# => [11, 22, 33, 44]

但是这个用例有点做作。此 &at 的更实际用途例如,lambda 将返回每个数组中的第二个元素。

看来我必须重新声明带有交换参数的 lambda,因为我想 curry 的论点不在第一位:

# The same lambda, but with swapped argument positions
at = ->(i, arr) { arr[i] }

# Supply the lambda with the integer 1, and then each array
p list.map(&at.curry[1])

# => [12, 22, 32, 42]

或者通过创建如下所示的代理接口(interface):

at_swap = ->(i, arr) { at.call(arr, i) }

这是正确的吗?没有办法乱序 curry 吗?我感觉像这样将有助于我们更好地重用 proc 和方法,但也许我忽略了一些东西。


这个网站上有一些类似的问题,但没有一个有具体的答案或解决方法。

Ruby Reverse Currying: Is this possible?

Ruby rcurry. How I can implement proc “right” currying?

Currying a proc with keyword arguments

最佳答案

目前Ruby 的标准库不提供这样的选项

但是,您可以轻松实现一个自定义方法,该方法允许您更改 Procs 和 lambda 的参数顺序。例如,我将展示 Haskell 的 flip 的模仿。功能:

flip f takes its (first) two arguments in the reverse order of f

在 Ruby 中它会是什么样子?

def flip
lambda do |function|
->(first, second, *tail) { function.call(second, first, *tail) }.curry
end
end

现在我们可以使用此方法来更改 lambda 的顺序。

concat = ->(x, y) { x + y }
concat.call("flip", "flop") # => "flipflop"

flipped_concat = flip.call(concat)
flipped_concat.call("flip", "flop") # => "flopflip"

关于ruby - 在 Ruby 中乱序柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588336/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com