将子句转换为 Fun

发布于 2024-08-11 21:29:17 字数 134 浏览 3 评论 0原文

如何使用 Fun 在一行中表示该子句。

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

How to represent this clause in one line using Fun.

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

路还长,别太狂 2024-08-18 21:29:17

我相信你正在寻求的是一种“自递归”的乐趣。

fun 语法无法在 fun 主体内引用自身,因此需要使用一种技巧,其中要调用的 fun 是参数。这通常称为 ycombinator。

一些示例代码可能会更好地描述它:

permutator() ->
  fun 
    ([], _F) ->
      [[]];
    (L, F) ->
      [ [H|T] || H <- L, T <- F(L--[H], F)]
  end.

do_permutate(L) ->
  P = permutator(),
  P(L, P).

正如您所看到的,这非常尴尬。如果您只是想引用自己的 perms 函数,可以使用代码:fun perms/1

I believe what you are seeking is for a fun to be "self-recursive".

The fun syntax is not able to refer to itself inside the fun body, so one need to use a trick where the fun to call is a parameter. This is commonly referred to as the ycombinator.

Some example code will likely describe it better:

permutator() ->
  fun 
    ([], _F) ->
      [[]];
    (L, F) ->
      [ [H|T] || H <- L, T <- F(L--[H], F)]
  end.

do_permutate(L) ->
  P = permutator(),
  P(L, P).

As you can see this is quite awkward. If you just wanted to refer to the perms functions of yours, you can use the code: fun perms/1.

江南烟雨〆相思醉 2024-08-18 21:29:17

我还得到了另一个类似于克里斯蒂安的答案。

5> Perms = fun(X) -> Fun = fun([],F) -> [[]]; (L,F) -> [[H|T] || H <- L, T <- F(L--[H],F)] end, Fun(X, Fun) end.
#Fun<erl_eval.6.13229925>
6> Perms("cat").
["cat","cta","act","atc","tca","tac"]

I also got another answer similar to Christian.

5> Perms = fun(X) -> Fun = fun([],F) -> [[]]; (L,F) -> [[H|T] || H <- L, T <- F(L--[H],F)] end, Fun(X, Fun) end.
#Fun<erl_eval.6.13229925>
6> Perms("cat").
["cat","cta","act","atc","tca","tac"]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文