代碼排序兩個輸入序列 - 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
。不知何故迭代沒有被執行。
EDIT 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"
}
謝謝。而不是作業:我正在使用F#編寫一些我用C編寫的東西來熟悉函數式編程。 – AruniRC
您能否詳細說明MoveNext()的位置?內部循環在'while'行中有MoveNext() – AruniRC
我不知道該如何說清楚。在調用iter02.MoveNext()之前,您正在訪問iter02.Current。您必須先調用MoveNext()。 – Brian