2

私は Erlang を初めて使用し、最初のプログラムをコンパイルしようとしていますが、コンパイル時に構文エラーが発生します。

filter_inside行 2未定義のポイントを取得している構文エラー。の前の最後の行にも構文エラーがありますX

関数.erl

-module(functions).
-export([filteri/2]).

filteri(_, []) -> 
                    []; 
filteri(P,[X|XS]) ->
                    [(map(P) X)|filteri P XS].

約 1 時間デバッグを試みましたが、成功しませんでした。コンパイルに失敗しているコードの原因を誰かが特定するのを手伝ってくれるかどうか疑問に思っていました。

よろしくお願いします!

4

2 に答える 2

4

Erlang は節をセミコロンで区切り;ます。

ステートメントはカンマで区切ります,

[];5 行目で使用するだけです。

最後の行も壊れています。Headリストの先頭に要素を追加Tailするに[Head|Tail]は、括弧を含めます。

関数呼び出しは次のようになりFun(Arg1, Arg2, ...)ます。

Erlang では大文字と小文字が区別されます。xはアトム (文字列定数と見なされる場合があります)Xですが、 は変数ですX

明示的な再帰よりも使いやすいのは、リスト内包表記[Fun(X) || X <- XS](または[Fun(X) || X <- XS, Predicate(X)]) です。

私はあなたが使用できると思います

filter_inside(Fun, XSS) ->
    [ [Fun(X) || X <- XS] || XS <- XSS ].

ソリューションでは、これを最後の行として使用できます。

[list:map(P, X)|filter_inside(P, XS)].  % Mind the function call syntax.

関数にエラーが含まれていたため、Erlang はその-export行に問題を報告したため、名前は不明です。

もう 1 つのコメント:filter_inside(_, [])スピードアップの最後の句として使用します。

于 2013-04-16T16:00:51.887 に答える
2

最後の行 [(map(P) X)|filter_inside P XS]. は次の[P(X) | filter_inside(P, XS)]. とおりです。構文を修正する必要があります。結果を返すために map apply と predicate 、つまり implement を探していますlists:map

例:次lists:map(fun(A)->A*2 end, [1,2,3,4,5]).のように同等の結果を取得するには[2,4,6,8,10]

次に、Erlang では、末尾再帰の最適化を利用するために次のように書くこともできます。

-module(functions).
-export([filter_inside/2]).

filter_inside(P,L) ->
    filter_inside(P,L, []).

filter_inside(_, [], Acc) -> 
    lists:reverse(Acc); 
filter_inside(P,[X|XS], Acc) ->
    filter_inside(P, XS,  [P(X) | Acc]).
于 2013-04-16T16:26:17.043 に答える