2016-08-22 4 views
2

私が何かやってみたかったとしますストリーム操作を行うErlangの方法は何ですか?

dict 
    .values() 
    .map(fun scrub/1) 
    .flatMap(fun split/1) 
    .groupBy(fun keyFun/1, fun count/1) 
    .to_dict() 

Erlangでこれを実現するための最もエレガントな方法は何を?

+0

奇妙なことに、私は実際のコードではほとんど必要としていない構築物です。私はおそらくそれを1つのマップ操作をdict上で行うだろう。 – rvirding

答えて

3

これを行う簡単な方法はありません。私が見たすべての試みは、簡単な構成よりもさらに悪く見えました。 Erlangのオープンソースプロジェクトの大部分を見ると、彼らは一般的な構成を使用していることがわかります。あなたの例を再利用してください:

+0

ありがとうございます。しかしそれは残念だ:( – BasilTomato

2

これはErlangに自然な構造ではありません。

lists:flatten(lists:map(fun (A) -> 
          do_stuff(A) 
         end, 
         generate_list())). 

の操作の長いシリーズ、仲介変数の場合:

Dict = #{hello => world, ...}, 
Values = maps:values(Dict), 
ScrubbedValues = lists:map(fun scrub/1, Values), 
SplitValues = lists:flatten(lists:map(fun split/1, ScrubbedValues)), 
GroupedValues = basil_lists:group_by(fun keyFun/1, fun count/1, SplitValues), 
Dict2 = maps:from_list(GroupedValues). 

あなたはすべての望んでいた場合、それは見てね方法ですあなたはカップルの機能を持っている場合は、定期的な組成物には、私が使用したいものですワンショットでグループ化された操作の私がここに書いたことはかなりある -

-spec remap_values(map()) -> map(). 
remap_values(Map) -> 
    map_values(maps:values(Map)). 

-spec map_values(list()) -> map(). 
map_values(Values) -> 
    map_values(Values, [], []). 

-spec map_values(list(), list(), list()) -> map(). 
map_values([], OutList, OutGroup) -> 
    %% Base case: transform into a map 
    Grouped = lists:zip(OutGroup, OutList), 
    lists:foldl(fun ({Group, Element}, Acc = #{Group := Existing}) -> 
         Acc#{Group => [Element | Existing]}; 
        ({Group, Element}, Acc) -> 
         Acc#{Group => [Element]} 
       end, 
       #{}, 
       Grouped; 
map_values([First|Rest], OutList, OutGroup) -> 
    %% Recursive case: categorize process the first element and categorize the result 
    Processed = split(scrub(First)), 
    Categories = lists:map(fun categorize/1, Processed), 
    map_values(Rest, OutList ++ Processed, OutGroup ++ Categories). 

実際の正しい実装コードが実行されるようになるだろうどのように大きく依存します:

しかし、私はこれは別の方法でより多くの可能性の高い書き込みをいただきたいですシンプルですが、大量のデータではうまく機能しない可能性があります。あなたが実際に無限のデータストリームを処理しようとしているのであれば、自分でそれを記述する必要があります(ただし、Gen Serverは非常に便利なフレームワークです)。

関連する問題