Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 合并两个时间戳序列以生成字符串时出错_F#_Functional Programming_F# Interactive - Fatal编程技术网

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