2015-01-16 13 views
1

下面是我會在標準庫中找到的東西嗎?是否有一個列表模塊功能就像解壓縮變壓器一樣

split transformer1 ([], []) [("Foo", 1); ("Bar", 2); ("FooBar", 3)];; 
> val it : string list * int list = (["FooBar"; "Bar"; "Foo"], [3; 2; 1]) 

這裏是我的執行

let split transformer defval stream = 
    let rec split' s acc = 
     match s with 
      | [] -> acc 
      | x::xs -> split' xs (transformer x acc) 
    split' stream defval 

let transformer1 (key, item) (akey, aitem) = (key::akey, item::aitem) 
let transformer2 (key, item) (akey) = (key::akey) 
let transformer3 (key, item) (a1, a2, a3) = (key::a1, item::a2, (item + 1)::a3) 

split transformer1 ([], []) [("Foo", 1); ("Bar", 2); ("FooBar", 3)];; 
split transformer2 ([]) [("Foo", 1); ("Bar", 2); ("FooBar", 3)];; 
split transformer3 ([], [], []) [("Foo", 1); ("Bar", 2); ("FooBar", 3)];; 

回答

5

據我所知,你已經徹底改造List.fold。以下是如何與fold重現結果:

[("Foo", 1); ("Bar", 2); ("FooBar", 3)] 
|> List.fold (fun (akey, aitem) (key, item) -> key::akey, item::aitem) ([], []) 

[("Foo", 1); ("Bar", 2); ("FooBar", 3)] 
|> List.fold (fun (akey) (key, item) -> key::akey) [] 

[("Foo", 1); ("Bar", 2); ("FooBar", 3)] 
|> List.fold (fun (a1, a2, a3) (key, item) -> key::a1, item::a2, (item + 1)::a3) ([], [], []) 

還有的(潛在懶洋洋地評估)序列的Seq.fold功能。

+0

哦,我的 - 在FP方面還有很多東西需要我學習。我必須承認褶皺進入了我的腦海,但不知怎的,對我來說「摺疊」的結果總是一個標量值。回到一個更復雜的結構從未跨過我的腦海。可能是由於幾乎所有的摺疊例子都返回了一個標量。 – robkuz

相關問題