リストの一致と末尾再帰のこつをゆっくりとつかむと、リストのリストをまとめて「つなぎ合わせる」関数が必要になりました (説明するよりも表示する方が簡単です)。
マージ [[1;2;3];[3;4;5];[5;6;7]] //-> [1;2;3;4;5;6;7]
List.merge 関数のコードは次のようになります。
///Like concat, but removes first value of each inner list except the first one
let merge lst =
let rec loop acc lst =
match lst with
| [] -> acc
| h::t ->
match acc with
| [] -> loop (acc @ h) t
| _ -> loop (acc @ (List.tl h)) t //first time omit first value
loop [] lst
(わかりました、2 レベルのリストしか処理しないため、concat とはまったく異なります)
質問: Seq of Seqs に対してこれを行うには (可変フラグを使用せずに)?
UPDATE(ジュリエットからの再コメント):私のコードは、オプションタイプに基づく「セグメント」で構成される「パス」を作成します:
type SegmentDef = Straight of float | Curve of float * float
let Project sampleinterval segdefs = //('clever' code here)
List.map (Project 1.) ListOfSegmentDefs を実行すると、各セグメントが前のセグメントが終了するのと同じポイントで始まるリストが返されます。これらのリストを結合してパスを取得し、各オーバーラップの「トップ/テール」のみを保持しますが、「セット」を行う必要はありません。他に重複がないことがわかっているからです。