2014-09-19 17 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

相关问题