Вычерчивание порядка в рубине - PullRequest
0 голосов
/ 29 мая 2018

В 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 лямбды будет возвращение, например, второго элемента в каждом из массивов.

Кажется, мне придется переопределить лямбду с помощью аргументов с перестановкой, поскольку аргумент Iхотите, чтобы карри находился не в первой позиции:

# 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]

Или путем создания прокси-интерфейса, подобного приведенному ниже:

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

Это правильно?Нет ли способа вывести из строя?Я чувствую, что это было бы полезно, чтобы мы могли лучше использовать методы и методы, но, возможно, я что-то упустил.


На этом сайте есть несколько похожих вопросов, но ни у одного нет конкретных ответов или обходных путей..

Ruby Reverse Curry: это возможно?

Ruby rcurry.Как я могу реализовать proc «правильное» каррирование?

Каррирование процесса с аргументами ключевых слов

1 Ответ

0 голосов
/ 25 января 2019

В настоящее время стандартная библиотека Ruby не предоставляет такой опции .

Однако вы можете легко реализовать собственный метод, который позволяет вам изменять порядок аргументов Procs и lambdas.Например, я представлю имитацию функции flip в Haskell:

flip f принимает два (первых) аргумента в обратном порядке f

Как бы это выглядело в Ruby?

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

И теперь мы можем использовать этот метод, чтобы изменить порядок наших лямбд.

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

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