我的这段代码的目标是根据一个简单的条件将两个拆分列表分成两个列表,而我在一个函数中做这件事情时遇到了麻烦。如何跟踪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(在这个例子中)的功能
编辑:使用一个元组作为蓄能器的伎俩!
这不是一个“撞车”,这是一个编译器错误。顺便说一句,在OCaml StdLib中包含一个函数来完成这个任务。 'List.partition'。 – nlucaroni
不允许使用除普及以外的任何内容,尽管感谢您的回应。 –