2016-04-27 10 views
-1

この割り当てには、以下のような助けが必要です。 マップファミリを使用してこの関数を実装する必要があります。erlangリストを使用してリストを減算する:map

mapSub(List1、List2)。

Subtracts List2 from List1 
Follows the order of appearance in 
List2. 
Implement it using map family 
Examples:  
mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2]). 
[2,3,4,5,3,4,5] 
mapSub ([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]). 
[2,3,4,5,3,4,5] 

問題は、私がLIST2から最初の要素を検索し、List1をの彼の最初の外観を削除した場合、私は使用を許可機能、exmpleため
とLIST2をメナージュことができる方法です。私はLIST2テールのヘッドに
を探し要素(LIST2の次の要素)
を置き換えることができますどのように
はあなたに感謝します。

+1

あなたはリストを地図と混同していると思います。 Erlangのマップは、 'Key' =>' Value'などの関連付けのハッシュテーブルです。 '#{a => 2、b => 3、c => 4、" a "=> 1、" b "=> 2、" c "=> 4}'あなたの質問には2つのリストがあります。今のところそれは正しく答えることができないので、質問を書き換えてください(おそらく閉じているはずです)。 – Amiramix

+0

@Amiramix:マップファミリーは 'lists:map/2'ではなく' maps'を意味すると思いますか?今それは少し意味があります。 –

+1

マップファミリが意味するものは本当にわかりませんが、 'lists:map/2'はErlangマップとはあまり関係ありません。リストの各要素を指定された関数で処理してリストを変換する操作です.Wikipediaのmap-reduceを参照してください:https://en.wikipedia.org/wiki/MapReduce Erlangには新しいデータ型があります。 R17で紹介されているマップについては、こちらをご覧ください:http://learnyousomeerlang.com/mapsあなたが後にしているマップファミリを決定する必要があります。 – Amiramix

答えて

-1
-module(wy). 
-compile(export_all). 


main() -> 
    L1 = [1,2,3,4,5,1,2,3,4,5], 
    L2 = [1,1,2], 
    [2,3,4,5,3,4,5] = mapSub(L1, L2), 
    [2,3,4,5,3,4,5] = mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]). 

mapSub(L1, L2) -> 
    mapSub(L1, L2, []). 

mapSub([], _, Res) -> 
    lists:reverse(Res); 
mapSub(L1, [], Res) -> 
    lists:reverse(Res) ++ L1; 
mapSub([H1 | T1], [H1 | T2], Res) -> 
    mapSub(T1, T2, Res); 
mapSub([H1 | T1], [H2 | _] = L2, Res) when H1 /= H2-> 
    mapSub(T1, L2, [H1 | Res]). 

このコードを試すことができます。

問題は典型的な再帰です。

+1

地図はどこですか? –

0
mapSub(L1, L2) -> 
    Inc = fun(X, Map) -> 
        Map#{X => maps:get(X, Map, 0) + 1} 
      end, 
    Map = lists:foldl(Inc, #{}, L2), 
    sub(L1, Map). 

sub([], _) -> []; 
sub([H|T], Map) -> 
    case maps:get(H, Map, 0) of 
     0 -> 
      [H | sub(T, Map)]; 
     N -> 
      sub(T, Map#{H => N - 1}) 
    end. 

test() -> 
    L1 = [1,2,3,4,5,1,2,3,4,5], 
    ok = check(L1, [1,1,2]), 
    ok = check(L1, [1,1,2,2]). 

check(L1, L2) -> 
    Expect = L1 -- L2, 
    case mapSub(L1, L2) of 
     Expect -> ok; 
     Error -> {error, [Expect, Error]} 
    end. 

はところで、あなたの例の結果が間違っているか、--より減算によって全く違う何かを意味します。

関連する問題