2015-08-26 2 views
2

Я читаю программирования Erlang, когда я ввожу их в Erlang РЕПЛ:Можно ли определить рекурсивную функцию в оболочке Erlang?

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 

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

+2

возможно дубликат [Определение функций Erlang в оболочке] (HTTP: // StackOverflow .com/questions/2065990/define-erlang-functions-in-the-shell) –

+0

Итак, нет способа определить рекурсивную функцию в оболочке erlang, правильно? – NeoWang

+2

'F = fun F ([X | Xs]) -> [do_something (X) | F (Xs)] end.' Затем назовите его «F (YourXList)». См. [Этот вопрос] (http://stackoverflow.com/questions/867418/how-do-you-write-a-fun-thats -recursive-в-Эрланга). –

ответ

5

С OTP 17.0 там названы фаны:

  • Funs теперь могут быть даны имена

Более подробную информацию в 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]] 
Смежные вопросы