Код сортирует две входные последовательности - 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 создали две последовательности А и В, а = {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'
EDIT
После коррекции:
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"
}
спасибо. а не домашнее задание: я перерабатываю некоторые вещи, которые я закодировал на C, используя F #, чтобы быть знакомыми с функциональным программированием. – AruniRC
Не могли бы вы рассказать о том, где указать MoveNext()? внутренний цикл имеет MoveNext() в строке «while» – AruniRC
Я не знаю, как сказать это яснее. Вы обращаетесь к iter02.Current, прежде чем вы вызываете iter02.MoveNext(). Сначала вы должны вызвать MoveNext(). – Brian