Можно ли определить рекурсивную функцию в оболочке Erlang?

Я читаю Programming Erlang, когда я набираю это в erlang REPL:

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
* 1: syntax error before: '->'

Я знаю, что не могу определять функции таким образом в оболочке, поэтому я меняю его на:

2> Perms = fun([]) -> [[]];(L) -> [[H|T] || H <- L, T <- Perms(L--[H])] end.
* 1: variable 'Perms' is unbound

Означает ли это, что я не могу определить рекурсивную функцию в оболочке?


person NeoWang    schedule 26.08.2015    source источник
comment
возможный дубликат определения функций erlang в оболочке   -  person Steve Vinoski    schedule 26.08.2015
comment
Значит, в оболочке erlang нельзя определить рекурсивную функцию, верно?   -  person NeoWang    schedule 26.08.2015
comment
F = fun F([X|Xs]) -> [do_something(X) | F(Xs) ] end. Затем назовите его как F(YourXList). См. этот вопрос.   -  person Steve Vinoski    schedule 26.08.2015
comment
@SteveVinoski Это не дубликат, потому что речь идет о рекурсивных функциях.   -  person Adam Lindberg    schedule 26.08.2015
comment
@AdamLindberg, вы видели ссылку в моем комментарии чуть выше вашего? Точно такой же вопрос.   -  person Steve Vinoski    schedule 26.08.2015
comment
Я должен был проголосовать за закрытие, потому что он дублирует этот вопрос, а не первый, который я выбрал, но, к сожалению, я не могу изменить что сейчас. Но дело в том, что мне потребовалось всего несколько секунд, чтобы найти ответ на сайте, чего ОП, по-видимому, не пытался сделать. Ответы на этот вопрос более полны, чем ответ ниже.   -  person Steve Vinoski    schedule 26.08.2015
comment
А, только что увидел первую ссылку, которую вы связали, извините.   -  person Adam Lindberg    schedule 26.08.2015
comment
этот вопрос лучше, он упоминает оболочку. Так что гугл привел меня сюда. Иди разберись...   -  person Sharas    schedule 28.08.2016


Ответы (1)


Начиная с OTP 17.0 существуют именованные забавы:

  • Забавам теперь можно давать имена

Подробнее см. README:

OTP-11537  Funs can now be a given a name. Thanks to to Richard O'Keefe
           for the idea (EEP37) and to Anthony Ramine for the
           implementation.
1> Perms = fun F([]) -> [[]];
               F(L) -> [[H|T] || H <- L, T <- F(L--[H])]
           end.    
#Fun<erl_eval.30.54118792>
2> Perms([a,b,c]).
[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]

В старых версиях вам нужно быть немного умнее, но как только вы это сделаете:

1> Perms = fun(List) ->
               G = fun(_, []) -> [[]];
                      (F, L) -> [[H|T] || H <- L, T <- F(F, L--[H])]
                   end,
               G(G, List)
           end.    
#Fun<erl_eval.30.54118792>
2> Perms([a,b,c]).
[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
person Hynek -Pichi- Vychodil    schedule 26.08.2015