このコードは、値に基づいて2つの入力シーケンス(seq01とseq02)をソートし、timestamp
値を順番に読み取るためにどちらのシーケンスを読み取るかを示すシーケンスを返します。
seq02のタイムスタンプ値がseq01のタイムスタンプ値よりも小さい場合は、返されるシーケンスに「2」を返します。それ以外の場合は「1」を返します。これらは、その時点でseq01を取得するか、データを順番に(タイムスタンプ値で)取得するためにseq02を取得するかを示します。
let mergeSeq (seq01:seq<_>) (seq02:seq<_>) =
seq {
use iter01 = seq01.GetEnumerator()
use iter02 = seq02.GetEnumerator()
while iter01.MoveNext() do
let _,_,time01 = iter01.Current
let _,_,time02 = iter02.Current
while time02 < time01 && iter02.MoveNext() do
yield "2"
yield "1"
}
FSIでテストするために、a = {1; 3;5;...}とb={0; 2;4;...}の2つのシーケンスaとbを作成しました。したがって、の期待値はlet c = mergeSeq a b
{"2"、 "1"、 "2"、"1"...}になります。ただし、次のエラーが発生します。error FS0001: The type ''a * 'b * 'c' does not match the type 'int'
編集
修正後:
let mergeSeq (seq01:seq<_>) (seq02:seq<_>) =
seq {
use iter01 = seq01.GetEnumerator()
use iter02 = seq02.GetEnumerator()
while iter01.MoveNext() do
let time01 = iter01.Current
let time02 = iter02.Current
while time02 < time01 && iter02.MoveNext() do
yield "2"
yield "1"
}
これを実行した後、別のエラーが発生します:call MoveNext
。どういうわけか、反復が実行されていません。
編集2
let mergeRef (seq01:seq<_>) (seq02:seq<_>) =
seq{
use iter01 = seq01.GetEnumerator()
use iter02 = seq02.GetEnumerator()
iter01.MoveNext()
iter02.MoveNext()
let temp01 = ref iter01.Current //!!using mutable reference
let temp02 = ref iter02.Current
while iter01.MoveNext() do
while (iter02.MoveNext()) && ((!temp02) < (!temp01)) do
temp02 := iter02.Current
yield "2"
yield "1"
temp01 := iter01.Current
//if seq01 finishes before seq02
while iter02.MoveNext() do
yield "2"
}