有沒有辦法,我可以合併2所列出F#交錯2列出
let a = ["a"; "b"; "c"]
let b = ["d"; "b"; "a"]
的方式,所以我得到這個結果
result = ["a"; "d"; "b"; "b"; "c"; "a"]
有沒有辦法,我可以合併2所列出F#交錯2列出
let a = ["a"; "b"; "c"]
let b = ["d"; "b"; "a"]
的方式,所以我得到這個結果
result = ["a"; "d"; "b"; "b"; "c"; "a"]
快速&骯髒的解決辦法是將壓縮兩個列表,然後平坦化所得的元組:
let interleave a b =
List.zip a b |> List.collect (fun (a,b)-> [a;b])
此方法返回交錯元素的列表:
interleave a b;;
val it : string list = ["a"; "d"; "b"; "b"; "c"; "a"]
zip
將從兩個列表的元素創建對:
val it : (string * string) list = [("a", "d"); ("b", "b"); ("c", "a")]
和collect
將壓平的元組
爲了補充@Panagiotis Kanavos的標準基於庫的答案,這裏有一個手實現它應該消耗略少的內存,因爲它不會構建元組(但仍需要中間列表):
let interleave a b =
let rec loop acc a b =
match a, b with
| [], l | l, [] -> List.rev l @ acc
// Or if you want to fail when the lengths are different, replace the above with:
// | [], [] -> acc
// | [], _ | _, [] -> failwith "interleave: List lengths are different"
| a :: aa, b :: bb -> loop (b :: a :: acc) aa bb
loop [] a b |> List.rev
(中this link解決方案不是尾遞歸,所以次優太)
這個任務是最好的解決foldBack2
:
let al = ["a"; "b"; "c"]
let bl = ["d"; "b"; "a"]
List.foldBack2 (fun a b xs -> a :: b :: xs) al bl []
// ["a"; "d"; "b"; "b"; "c"; "a"]
是你試圖找到自己的解決方案? –