1

次のようなコードがあります。

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

リストの関数を1つの数値の関数に変える必要があります。たとえば、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).

したがって、リスト要素は1ではなく0からカウントされます。I= 3で呼び出すと、失敗します。ですから、これは閉鎖についてではありません。

まだシャドウイングの警告がありますが、それは完全に別の問題です。

4

1 に答える 1

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
于 2012-06-08T19:19:36.623 に答える