在Erlang中创建闭包:为什么变量没有绑定?

在Erlang中创建闭包:为什么变量没有绑定?,erlang,closures,shadowing,Erlang,Closures,Shadowing,我有一段代码是这样的: 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_

我有一段代码是这样的:

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-u列表中失败,列表为空

我对Erlang还是一个新手,我觉得我缺少了一些概念性的东西,而不仅仅是语法问题

UPD:发现一个bug。我以这种方式将x_写入了列表/3:

x_to_list( X, L, I ) ->
    lists:sublist(L, I) ++ [ X ] ++ lists:nthtail(I+1, L).
所以它从0开始计算列表元素,而不是1。当我用I=3调用它时,它失败了。所以这不是关于封闭


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

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

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

你能给我看一下
x\u to\u list
的定义吗?错误一定存在,因为以这种方式定义的变量和lambda总是形成一个闭包。哦!我发现了我的一个错误。这不是一个模糊的问题,只是一个纯粹的错误。你能给出
x_to_list
的定义吗?错误一定存在,因为以这种方式定义的变量和lambda总是形成一个闭包。哦!我发现了我的一个错误。这不是一个模糊的问题,只是一个纯粹的错误。