2014-03-26 38 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

已更新。謝謝您的幫助! –