【发布时间】:2014-03-28 04:42:03
【问题描述】:
我的这段代码的目标是根据一个简单的条件将一个列表分成两个列表,而我在一个函数中执行此操作时遇到了麻烦。
目前,我折叠传入的列表并说如果条件为真,则添加到列表一。然后我再次弃牌并说如果条件为假,则添加到列表二。这对于较大的列表来说效率非常低,我不知道如何将它组合成一个折叠。
我的工作,低效的代码目前看起来像这样:
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,它仍然是 []...我怎样才能在 ONE 函数中跟踪 list_two 和 list_one?
另外,对于那些不熟悉 fold 的人 - 它是一个迭代原始元素并将结果累积到 old_list_one 的函数(在本例中)
编辑:使用元组作为累加器就可以了!
【问题讨论】:
-
这不是“崩溃”,而是编译器错误。顺便说一句,OCaml StdLib 中包含一个功能就是这样做的。
List.partition. -
不允许使用除普遍性之外的任何东西,不过感谢您的回复。