seq<#seq<'a>> ->seq<seq<'a>>
(Zip2 や Zip3 のように 2 または 3 ではなく) 任意の数の入力シーケンスのシーケンスを取得し、結果としてタプルではなくシーケンスのシーケンスを返す Zip メソッドのように機能するシグネチャを持つ関数を作成したいと考えています。
つまり、次の入力があるとします。
[[1;2;3];
[4;5;6];
[7;8;9]]
結果を返します: [[1;4;7]; [2;5;8]; [3;6;9]]
リストの代わりにシーケンスを除いて。
私は F# を初めて使用しますが、必要な機能を備えた関数を作成しましたが、改善できることはわかっています。末尾再帰ではなく、もっと簡単にできるようですが、まだ方法がわかりません。int list list
また、2 番目の関数を使用せずに、必要な方法で署名を取得する (たとえば、入力として受け入れる) 良い方法も見つかりませんでした。
列挙子を直接使用してこれを実装できることは知っていますが、機能的な方法で実装することに興味があります。
これが私のコードです:
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