如何在OCaml中跟踪功能(折叠)中的两个列表?

时间:2014-03-26 15:29:45

标签: ocaml fold

我的代码的目标是基于一个简单的条件将两个分成一个列表分成两个列表,并且我只在一个函数中执行此操作时遇到问题。

目前,我折叠传入的列表并说明条件是否为真,添加到列表一。然后我再次折叠并说明条件是否为假,添加到列表2。这对于较大的列表来说效率非常低,而且我不知道如何将它组合成一个折叠。

我工作效率低下的代码目前看起来像这样:

let function test old_list_one original_list =
  let list_one = (fold (fun a elt -> 
      if condition = true then elt::a
        else a) old_list_one original_list) in
  let list_two = (fold (fun a elt -> 
      if condition = false then elt::a
            else a) [] original_list) in
do_something list_one list_two

这适用于较小的集合但在较大的集合上耗尽资源。我试着像这样组合折叠:

let function test old_list_one = 
  let list_two = [] in
  let list_one = (fold (fun a elt -> 
      if (condition) = true then elt::a
        else elt::list_two) old_list_one original) in
do_something list_one list_two

OCaml没有跟踪list_two并且它仍然是[] ...如何在一个函数中跟踪list_two和list_one?

另外,对于那些不熟悉fold的人来说,它是一个迭代原始元素的函数,并将结果累积到old_list_one(在本例中)

编辑:使用元组作为累加器就可以了!

1 个答案:

答案 0 :(得分:2)

使用一对列表作为累加器参数。积累的价值可以是你喜欢的任何东西。

这里有一个概述的草图:

let f (a, b) x =
    let a' = <calculate> in
    let b' = <calculate> in
    (a', b')

let (list1, list2) = List.fold_left f ([],[]) original_list