【发布时间】:2016-04-11 17:18:05
【问题描述】:
我只能创建分配给变量的匿名函数,如下所示:
Foo = fun(X) -> X end.
我知道如果你在一个模块中,你可以这样做:
foo(X) -> X.
foo(X, Y) -> X + Y.
% i.e. foo(3) = 3, foo(3,4) = 7
我的问题是:匿名函数可以做到吗?
一篇博文(对不起,我现在丢了)让我觉得你可以做这样的事情:
Foo = fun(X) -> X;
(X, Y) -> X + Y
end.
但这不起作用,因为我收到“头部不匹配”错误。
【问题讨论】:
-
您只能为模式匹配执行此操作,即
Foo = fun({x,y}) -> one; ({a,b}) -> two end,除非您只接受一个列表,例如Foo = fun([X]) -> X; ([X,Y]) -> {X,Y} end,否则我想不出一种方法可以做您想做的事情,调用@ 987654326@和Foo([a,b])等 -
是的,除了接受列表之外,我什么也找不到。在实际情况下,传递的每个变量都是不同的东西,所以一种选择是传递一个 proplist(我认为这是一个惯用的映射,我是 Erlang 的新手)并这样做大大地。如果您想要甜蜜的业力,请让您的评论成为答案:P
-
其实这是一个非常有趣的问题,我从来没有注意到或想过这个......
-
Name + Arity 是函数的identity。在匿名函数的情况下,您缺少名称。在一个真正的程序中你不应该有一个你不知道你正在拨打的电话的数量的情况。这种情况怎么会存在?在 FP 中弹出这么多 1 的 lambda 的原因是由于列表(即,一个接一个地迭代)。如果您不知道调用匿名函数的数量,您将如何编写代码?即使你可以为什么你会那样做?不过请记住,您可以使用列表或元组参数正确编写可变参数函数。
-
@SCdF
{M,F,A}当然也是一个论据。如果您可以控制函数的传递并控制它的调用,我认为您必须这样做,否则您将符合特定的 API / 接口,那么您可以传递{M,F,A}或{M,F}价值。这也意味着您没有浮动的匿名函数,如果它们停留的时间足够长,当您进行节点/版本升级时,它们可能会破坏。
标签: erlang