假设我有一个数组
let arr = [|1;2;3;4;5;6|]
我希望将其转换为类似以下的形式:
[|(1,2);(3,4);(5,6)|]
我看到过Seq.window,但这个会生成类似于:
[|(1,2);(2,3);(3,4);(4,5);(5,6)|]
这不是我想要的
假设我有一个数组
let arr = [|1;2;3;4;5;6|]
[|(1,2);(3,4);(5,6)|]
[|(1,2);(2,3);(3,4);(4,5);(5,6)|]
这不是我想要的
let input = [|1..10|]
Array.chunkBySize 2 list |> Array.map (fun xs -> (xs.[0], xs.[1]))
let arr = [|1;2;3;4;5|]
seq { for i in 0 .. 2 .. arr.Length - 2 -> (arr.[i], arr.[i+1]) } |> Seq.toArray
你可以使用Seq.pairwise
,只要过滤掉每个元组中的另一个。过滤需要通过迭代传递状态,通常是通过scan
函数实现的。
[|1..10|]
|> Seq.pairwise
|> Seq.scan (fun s t ->
match s with None -> Some t | _ -> None )
None
|> Seq.choose id
|> Seq.toArray
// val it : (int * int) [] = [|(1, 2); (3, 4); (5, 6); (7, 8); (9, 10)|]
但是,也有可能让scan
直接生成元组,虽然会带来中间数组的惩罚。
[|1..10|]
|> Array.scan (function
| Some x, _ -> fun y -> None, Some(x, y)
| _ -> fun x -> Some x, None )
(None, None)
|> Array.choose snd
Seq.pairwise
将序列转换为元组。[|1;2;3;4;5;6|]
|> Seq.pairwise
|> Seq.toArray
val it : (int * int) [] = [|(1, 2); (2, 3); (3, 4); (4, 5); (5, 6)|]
应该是:
let rec slice =
function
| [] -> []
| a::b::rest -> (a,b) :: slice (rest)
| _::[] -> failwith "cannot slice uneven list"