我有一段代码如下:
Fi_F = fun (F, I, Xs) ->
fun ( X ) ->
F( x_to_list(X, Xs, I) )
end
end,
我只需要将list的函数转换为一个数字的函数。例如,当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调用它时,它会失败。所以这不是关闭。
我仍然有阴影警告,但这完全是另一个问题。
答案 0 :(得分: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