2014-03-26 33 views
0

我的这段代码的目标是根据一个简单的条件将两个拆分列表分成两个列表,而我在一个函数中做这件事情时遇到了麻烦。如何跟踪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于一体的功能仍然[] ...?

此外,对于那些不熟悉倍 - 那就是每一个元素遍历原件及积聚的结果old_list_one(在这个例子中)的功能

编辑:使用一个元组作为蓄能器的伎俩!

+1

这不是一个“撞车”,这是一个编译器错误。顺便说一句,在OCaml StdLib中包含一个函数来完成这个任务。 'List.partition'。 – nlucaroni

+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 
+0

我如何重新访问列表中的列表?所以如果我要做'让pair_of_lists =(fold)[solutions; []] original'并且将它添加到累加器的头部,如果条件为真,尾部是假的,我不知道如何重新访问折叠完成后的对子列表。我会用我正在尝试的代码更新这个问题,这样你就可以看到我的意思了。 –

+0

已更新。谢谢您的帮助! –