gpt4 book ai didi

erlang - 是否可以在 Erlang shell 中定义递归函数?

转载 作者:行者123 更新时间:2023-12-02 06:04:54 25 4
gpt4 key购买 nike

我正在阅读《Programming Erlang》,当我在 erlang REPL 中输入这些内容时:

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

我知道我不能在 shell 中以这种方式定义函数,所以我将其更改为:

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

这是否意味着我无法在 shell 中定义递归函数?

最佳答案

OTP 17.0有命名的乐趣:

  • Funs can now be given names

更多详细信息请参见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]]

关于erlang - 是否可以在 Erlang shell 中定义递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217300/

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