0

このコードは、値に基づいて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"

       }
4

3 に答える 3

3

変更する必要があります

let _,_,time01 = iter01.Current
let _,_,time02 = iter02.Current

let time01 = iter01.Current
let time02 = iter02.Current

コードが。で型チェックされるようにしseq<int>ます。

私はあなたの意図を理解していません。2つのシーケンスで対応する要素の各ペアを比較する場合は、より機能的な解決策があります。

let mergeSeq seq01 seq02 = 
    Seq.map2 (fun s1 s2 -> if s2 < s1 then "2" else "1") seq01 seq02

ソートされた2つのシーケンスをマージする場合は、を使用しても問題ありませんGetEnumeratorが、返されるので意味がありません。"2""1"

于 2012-06-22T10:54:01.520 に答える
2

まるでコードを書いたかのように

a={1,1,1;2,2,2;3,3,3...}

使用するだけ

            let time01 = iter01.Current
            let time02 = iter02.Current 
于 2012-06-22T10:54:47.557 に答える
2

編集後...

currentにアクセスする前に、2でMoveNextを呼び出す必要があります。内側のループで2を移動するときに、time02を更新していません。また、シーケンスの終わりを適切にチェックしていません(たとえば、2が終了しても、1が進行中の場合は、終了後に2にアクセスしようとします)。

(これは宿題ですか?)

于 2012-06-22T16:26:17.060 に答える