我做了一些研究,我发现List.zip函数有两个列表并返回一个元组列表,但是如何将一个列表更改为元组列表呢?
let rec combinePair xs =
match xs with
| [] -> []
| [x1] -> []
| x1::x2::x3::xs -> [(x1, x2)]
| x1::x2::xs -> [(x1, x2)]
如果列表中存在奇数个元素,则应删除最后一个元素,如果存在偶数个元素,则应将它们作为元组列表返回。例如
combinePair [x1; x2; x3; x4] = [(x1, x2); (x3, x4)]
答案 0 :(得分:5)
您的代码几乎那里。
以下是这个想法:
这几乎可以完全翻译为F#:
let rec combinePair xs =
match xs with
| [] | [_] -> []
| x1::x2::rest -> (x1, x2) :: (combinePair rest)
(请注意我如何将前两个案例合并到一行[] | [_] ->
)
答案 1 :(得分:2)
我确信有更漂亮的解决方案,但对于那些对递归过敏的人:
let xsOdd = [1;2;3;4;5]
List.chunkBySize 2 xsOdd
|> List.filter (fun x -> x.Length = 2)
|> List.map (fun x -> x.[0],x.[1])
//val it : (int * int) list = [(1, 2); (3, 4)]