【问题标题】:Create a closure in Erlang: why are variables not bound?在 Erlang 中创建闭包:为什么没有绑定变量?
【发布时间】:2012-06-08 18:46:46
【问题描述】:

我有一段代码是这样的:

Fi_F = fun (F, I, Xs) -> 
           fun ( X ) -> 
                F( x_to_list(X, Xs, I) ) 
           end 
end,

我只需要将列表的函数转换为一个数字的函数。例如,对于 Xs = [1,2,3] 和 I = 2,我希望这可以授予我以下功能:

fun ( X ) -> F([ 1, X, 3]) end.

但不知何故,F、I 和 X 被遮蔽,而不是封闭,因此它在 x_to_list 中失败,列表为空。

我还是 Erlang 的新手,我认为我缺少概念性的东西,而不仅仅是语法问题。

UPD:发现了一个错误。我是这样写 x_to_list/3 的:

x_to_list( X, L, I ) ->
    lists:sublist(L, I) ++ [ X ] ++ lists:nthtail(I+1, L).

所以它从 0 开始计算列表元素,而不是 1。当我用 I = 3 调用它时,它会失败。所以这不是关闭。

虽然我仍然有阴影警告,但这完全是另一个问题。

【问题讨论】:

  • 你能说明x_to_list的定义吗?错误一定存在,因为以这种方式定义的变量和 lambdas 总是形成一个闭包。
  • 哦!我发现我的错误。这不是阴影问题,只是纯粹的不准确。

标签: erlang closures shadowing


【解决方案1】:

x_to_list/3 的一个快速而肮脏的实现(只是为了测试)是:

x_to_list(X, Xs, I) ->
   { Pre, Post } = lists:split(I-1, Xs),
   Pre ++ [X] ++ tl(Post).

然后,您的代码可以正常运行:

> Q = fun ( F, I, Xs ) -> fun (X) -> F( x_to_list(X, Xs, I)) end end.
> Y = Q( fun(L) -> io:format("~p, ~p, ~p~n", L) end, 2, [1,2,3] ).
> Y(4).
1, 4, 3
ok

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 2016-06-14
    • 2018-02-25
    • 1970-01-01
    • 2015-02-26
    • 2013-11-03
    • 2020-06-27
    • 2013-07-12
    相关资源
    最近更新 更多