F# 合并两个时间戳序列以生成字符串时出错
代码根据它们的F# 合并两个时间戳序列以生成字符串时出错,f#,functional-programming,f#-interactive,F#,Functional Programming,F# Interactive,代码根据它们的时间戳值对两个输入序列(seq01和seq02)进行排序,并返回一个序列,该序列指示要读取的顺序顺序值 对于seq02的时间戳值小于seq01的时间戳值的情况,我们为返回的序列生成“2”,否则为“1”。这些表示在该点是采用seq01还是采用seq02以使数据有序(通过时间戳值) 运行此操作后,出现另一个错误:调用MoveNext。不知何故,没有执行迭代 编辑2 let mergeRef (seq01:seq<_>) (seq02:seq<_>) =
时间戳
值对两个输入序列(seq01和seq02)进行排序,并返回一个序列,该序列指示要读取的顺序顺序值
对于seq02的时间戳值小于seq01的时间戳值的情况,我们为返回的序列生成“2”,否则为“1”。这些表示在该点是采用seq01还是采用seq02以使数据有序(通过时间戳值)
运行此操作后,出现另一个错误:调用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"
}
let mergeRef(seq01:seq)(seq02:seq)=
序号{
使用iter01=seq01.GetEnumerator()
使用iter02=seq02.GetEnumerator()
iter01.MoveNext()
iter02.MoveNext()
让temp01=ref iter01.Current/!!使用可变引用
设temp02=参考iter02.电流
而iter01.MoveNext()则
而(iter02.MoveNext())和(!temp02)<(!temp01))执行
temp02:=iter02.电流
收益率“2”
收益率“1”
temp01:=iter01.电流
//如果seq01在seq02之前完成
而iter02.MoveNext()做什么
收益率“2”
}
您需要更改
let _,_,time01 = iter01.Current
let _,_,time02 = iter02.Current
到
这样就可以使用seq
对代码进行类型检查
我不明白你的意图。如果要比较两个序列中的每对对应元素,则有更多功能解决方案:
let mergeSeq seq01 seq02 =
Seq.map2 (fun s1 s2 -> if s2 < s1 then "2" else "1") seq01 seq02
让mergeSeq seq01 seq02=
Seq.map2(乐趣s1 s2->如果s2
如果要合并两个已排序的序列,可以使用
GetEnumerator
,但返回“2”
和“1”
对我来说没有意义。您编写的代码就好像
a={1,1,1;2,2,2;3,3,3...}
只用
let time01 = iter01.Current
let time02 = iter02.Current
编辑后
在访问current之前,需要在2上调用MoveNext。当您在内部循环中通过2时,您不会更新time02。并且您没有正确地检查序列的结尾(例如,如果2个结尾但1正在进行,您将尝试在结尾后访问2)
(这是家庭作业吗?涉及到一些文件I/O,以及相当大的数据块和时间戳。想要保留“1”、“2”作为从哪个序列读取的指示符,以便执行最终(下一个)合并步骤(未显示)。
seq{}
是惰性的,它建立的是计算,而不是数据,因此您不必担心。也许你应该描述一下你真正的用例。谢谢。即时问题已解决,但仍在运行时出错。问题已被适当编辑。谢谢。而不是家庭作业:为了熟悉函数式编程,我正在用F#重新编写我用C编写的一些东西。你能详细说明一下在哪里使用MoveNext()吗?内部循环的'while'行中确实有MoveNext(),我不知道如何说得更清楚。在调用iter02.MoveNext()之前,您正在访问iter02.Current。你必须先调用MoveNext(),这一点很清楚。已更改代码,正在工作。谢谢你的耐心。:)
let mergeSeq seq01 seq02 =
Seq.map2 (fun s1 s2 -> if s2 < s1 then "2" else "1") seq01 seq02
a={1,1,1;2,2,2;3,3,3...}
let time01 = iter01.Current
let time02 = iter02.Current