该代码根据它们的值对两个输入序列 - 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 和 b,a={1;3;5;...} 和 b={0;2;4;...}。所以预期的值为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"
}