2016-12-02 9 views
3

Я хочу частично применить функцию. Есть ли стандартный лаконичный способ делать какие-либо карри в Elixir?Есть ли стандартная функция curry() в Elixir?

Я знаю, что я могу сделать нечто вроде этого:

new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end 

new_func2 = fn -> my_func2(constant) end 

, но это выглядит некрасиво.

+1

Вы видели этот блог? http://blog.patrikstorm.com/function-currying-in-elixir –

+0

Спасибо. Как мы видим, я действительно искал что-то более простое, т. Е. Для закрытия. Что касается карри, статья 1,5 года, поэтому я не был уверен, что она по-прежнему актуальна. – raacer

ответ

5

Вы можете использовать оператор захвата &, чтобы очистить его немного:

plus2 = &Kernel.+(2, &1) 
plus2.(4) 
6 

Обратите внимание на точечную . между Plus2 и это круглые скобки

Поскольку это своего рода синтаксический сахар для

plus2 = fn(right) -> Kernel.+(2, right) end 

применяются все те же правила. Как и вы должны предоставить все аргументы функции, которую вы выполняете, и вы можете поместить позиционные аргументы в любом порядке.

Docs: http://elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#&/1

+0

Спасибо! Это выглядит лучше, но по какой-то причине это не работает с func/1. Этот код "create_named_window = & create_window (title)" создает CompileError: "недопустимые аргументы для &, ожидаемое выражение в формате & Mod.fun/arity, & local/arity или захват, содержащий хотя бы один аргумент как & 1, получил: create_window (title) « – raacer

+1

@raacer, когда вы используете оператор захвата, у вас должен быть хотя бы один аргумент, поэтому вы можете' & create_window (& 1) ', но не так, как у вас есть выше. – greggreg

+1

Кроме того, то, что вы описываете в своем комментарии, - это не совсем карри-функция, это закрытие. Вместо создания приложения с частичной функцией вы удовлетворили все аргументы и пытаетесь вызвать его с помощью 'title' в области видимости. То, что вы хотите, это 'fn -> create_window (title) end', поскольку оно специально предназначено для создания закрытий. Даже в языке, известном карри, как Хаскелл, вы не можете описать вышеизложенное, к сожалению, не существует. – greggreg