2014-09-19 31 views
0

我必須遍歷一個列表中包含元素的序列,如Sequence = ["1","2","4","5"]。需要準備9個列表,只能從Sequence計算。我有以下foldl。通過摺疊erlang在元組的不同列表中收集多個值

Accumulators = {[], [], [], [], [], [], [], [], []}, 
ReturnedTup = lists:foldl(fun(Seq, Acc) -> 
     {AccF1,AccF2,AccF3, AccF4,AccF5,AccF6, AccF7,AccF8,AccF9} = Acc, 
     F1 = get_seq_indexlist(Seq, "F1"), 
     F2 = get_seq_indexlist(Seq, "F2"), 
     F3 = get_seq_indexlist(Seq, "F3"), 
     ... 
     F9 = get_seq_indexlist(Seq, "F9"), 
     [F1|AccF1], [F2|AccF2], [F3|AccF3], ...,[F9|AccF9], 
     Acc  
    end, Accumulators, Sequence), 
io:format("~p ReturnedTup", [ReturnedTup]). 

但在這裏我得到ReturnedTup空的,因爲{[], [], [], [], [], [], [], [], []}。我不確定它有什麼不對。我在F1, F2, F3... F9中獲得適當的值。

我是erlang的新手。有可能是有效的方法來做到這一點。如果是這樣,讓我知道。

回答

1

你在與foldl函數總是返回初始累積:

Acc 

您需要返回新ACC必須是包含最新名單:

Accumulators = {[], [], [], [], [], [], [], [], []}, 
ReturnedTup = lists:foldl(fun(Seq, Acc) -> 
     {AccF1,AccF2,AccF3, AccF4,AccF5,AccF6, AccF7,AccF8,AccF9} = Acc, 
     F1 = get_seq_indexlist(Seq, "F1"), 
     F2 = get_seq_indexlist(Seq, "F2"), 
     F3 = get_seq_indexlist(Seq, "F3"), 
     ... 
     F9 = get_seq_indexlist(Seq, "F9"), 
     {[F1|AccF1], [F2|AccF2], [F3|AccF3], ...,[F9|AccF9]} 
    end, Accumulators, Sequence), 
1

橡膠Cthulu的答案是一個元組只有開始:)

這將是很好的刪除代碼重複。如果你是複製粘貼九次 - 這很難保持。

Sequence = ["1","2","4","5"], 
Accumulators = [[], [], [], [], [], [], [], [], []], 
CounterToString = fun(Integer) -> "F"++integer_to_list(Integer) end, 
FoldlFun = fun(SequenceElement, Acc) -> 
        PrependSeqIndexList = fun(Counter, InnerAcc) -> 
               [get_seq_indexlist(SequenceElement, CounterToString(Counter)) | InnerAcc] end, 
        {NewAccs, _LastCounter} = lists:mapfoldl(fun(InnerAcc, Counter) -> 
                    {PrependSeqIndexList(Counter, InnerAcc), 
                    Counter+1} end, 1, Acc), 
        NewAccs 
      end, 
ReturnedList = lists:foldl(FoldlFun, Accumulators, Sequence), 
ReturnedTup = list_to_tuple(ReturnedList), 
io:format("~p ReturnedTup", [ReturnedTup]). 
  • 我會改變SeqSequenceElement,因爲功能,那就是foldl/3參數採用序列元素,而不是整個序列。或者你可以將其命名爲InnerSequence - 無所謂。
  • 你想迭代內部累加器,所以使他們成爲一個列表
  • 使用mapfoldl迭代內部累加器 - 它像地圖一樣工作,但它也有累加器,我們將用於計數器。
  • 如果您真的需要元組返回值,請在末尾使用list_to_tuple/1
  • 爲您的助手命名,這樣可以更輕鬆地閱讀代碼。
  • 如果您在其他樂趣中創造樂趣,則可以使用外部樂趣參數。 PrependSeqIndexList使用SequenceElement即使它在外部範圍。它被稱爲封閉。
  • 還有其他的方法來改善這個代碼 - 例如,它仍深深嵌套,但我將它作爲一個練習吧:)
+0

非常酷,這是一個學習我挺有趣的事情:) – trex 2014-09-19 07:33:05