元組我定義了一個點不完整的模式匹配在F#
type TimeSeriesPoint<'T> =
{ Time : DateTimeOffset
Value : 'T }
等一系列
type TimeSeries<'T> = TimeSeriesPoint<'T> list
,我認爲在這個列表中的點按時間排序。
我想壓縮兩個時間序列,其中,一般來說,他們將有同一時間的點,但可能有一些點在其中任何一個缺失。
任何想法爲什麼我在下面的代碼中得到不完整模式匹配的警告?
let zip (series1 : TimeSeries<float>) (series2 : TimeSeries<float>) =
let rec loop revAcc ser1 ser2 =
match ser1, ser2 with
| [], _ | _, [] -> List.rev revAcc
| hd1::tl1, hd2::tl2 when hd1.Time = hd2.Time ->
loop ({ Time = hd1.Time; Value = (hd1.Value, hd2.Value) }::revAcc) tl1 tl2
| hd1::tl1, hd2::tl2 when hd1.Time < hd2.Time ->
loop revAcc tl1 ser2
| hd1::tl1, hd2::tl2 when hd1.Time > hd2.Time ->
loop revAcc ser1 tl2
loop [] series1 series2
如果我這樣寫,我沒有警告,但它是尾遞歸嗎?
let zip' (series1 : TimeSeries<float>) (series2 : TimeSeries<float>) =
let rec loop revAcc ser1 ser2 =
match ser1, ser2 with
| [], _ | _, [] -> List.rev revAcc
| hd1::tl1, hd2::tl2 ->
if hd1.Time = hd2.Time then
loop ({ Time = hd1.Time; Value = (hd1.Value, hd2.Value) }::revAcc) tl1 tl2
elif hd1.Time < hd2.Time then
loop revAcc tl1 ser2
else
loop revAcc ser1 tl2
loop [] series1 series2
我會在第一個比賽結束時將它寫成「全部」 _ - > List.rev revAcc – Gustavo 2012-07-06 08:06:10