5

与えられた関数:

min(A, B)  when A =< B -> A;
min(_A, B)             -> B.

これを関数foldlでこれと同じように使用できますか?

lists:foldl(fun min/2, 0, [1,2,3,4,5,6,7,8,9,10])

リストの残りの部分と比較される初期値を設定する必要があるため、それは不可能だと思います。たとえば、私が考えることができる恒等関数はありません。私は正しいですか?

構文はErlangで書かれていますが、Erlang以外のプログラマーも読めるようにする必要があります。

4

3 に答える 3

11
min(List) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, undefined, List).

初期状態として使用undefinedすると、うまくいくはずです。空のリストを返しますundefined。これは、APIとしては便利です。

空のリストでクラッシュさせたい場合は、代わりに次の関数ヘッダーを使用してください。

min([Head|Rest]) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, Head, Rest).
于 2011-03-02T13:43:38.017 に答える
5
1> List = [42,13,25,3,19,20].
[42,13,25,3,19,20]
2> lists:foldl(fun(X, Y) -> erlang:min(X,Y) end, hd(List), tl(List)).   
3

空のリストでプログラムをクラッシュさせます。防御的なプログラミングとは対照的に、推奨されるアプローチは「クラッシュさせます」。

于 2011-03-02T13:46:07.007 に答える
2

初期値として使用するというAdamLindbergsの提案にundefinedは、アトムをメンバーとして持つリストに対して奇妙な結果が生成されるという欠点があります。Erlangにはすべてのオブジェクトのグローバルな順序があるため、min関数の優れたプロパティはすべてのタイプで使用できることです。

空のリストでクラッシュする方が合理的だと思います。違いは、クライアントが結果としてを取得することを心配するのではなく、ケースを心配する必要があるundefinedということです。

于 2011-03-04T15:20:59.607 に答える