我想创建一个具有签名的函数,该函数seq<#seq<'a>> ->seq<seq<'a>>
类似于 Zip 方法,采用任意数量的输入序列(而不是 Zip2 和 Zip3 中的 2 或 3 个)并返回序列序列而不是元组作为结果。
也就是说,给定以下输入:
[[1;2;3];
[4;5;6];
[7;8;9]]
它将返回结果:[[1;4;7]; [2;5;8]; [3;6;9]]
除了序列而不是列表。
我对 F# 很陌生,但我创建了一个可以满足我需求的函数,但我知道它可以改进。它不是尾递归,它似乎可以更简单,但我还不知道如何。我还没有找到一种在int list list
没有第二个函数的情况下以我想要的方式(接受,例如,作为输入)获取签名的好方法。
我知道这可以直接使用枚举器来实现,但我有兴趣以一种功能性的方式来实现。
这是我的代码:
let private Tail seq = Seq.skip 1 seq
let private HasLengthNoMoreThan n = Seq.skip n >> Seq.isEmpty
let rec ZipN_core = function
| seqs when seqs |> Seq.isEmpty -> Seq.empty
| seqs when seqs |> Seq.exists Seq.isEmpty -> Seq.empty
| seqs ->
let head = seqs |> Seq.map Seq.head
let tail = seqs |> Seq.map Tail |> ZipN_core
Seq.append (Seq.singleton head) tail
// Required to change the signature of the parameter from seq<seq<'a> to seq<#seq<'a>>
let ZipN seqs = seqs |> Seq.map (fun x -> x |> Seq.map (fun y -> y)) |> ZipN_core