ОК, пробираюсь через это, когда у меня есть минутка.
Вот первая часть, где вы можете объединить слайды двух АБ:
// this function can merge two slides
let mergeSlides l1 l2 =
List.zip l1 l2
|> List.map (fun ((a1, b1), (a2,b2)) -> (a1, b1+b2))
// see what it does
mergeSlides aB2.Slide correctoraB2.Slide
Этот бит группирует все АБ с одинаковым Id:
let grp = bunchedABRaw
|> Seq.groupBy (fun a -> a.ID)
ИТеперь мы можем использовать mergeSlides в качестве функции свертывания, которую мы используем сворачивание для каждой последовательности Ab с тем же Id, чтобы сделать netB aB.
Итак, вот и все:
let mergeSlides l1 l2 =
List.zip l1 l2
|> List.map (fun ((a1, b1), (a2,b2)) -> (a1, b1+b2))
let net =
bunchedABRaw
|> Seq.groupBy (fun a -> a.ID)
|> Seq.map (fun (i, s) -> (i, s |> Seq.map (fun a -> a.Slide))) // strip away the slides
|> Seq.map (fun (i, s) -> (i, List.ofSeq s)) // turn seq<slide> into list<slide>
|> Seq.map (fun (i, l) -> (i, List.fold mergeSlides l.Head l.Tail)) // so we can use HEad and Tail
|> Seq.map (fun (i, l) -> {ID=i;Slide=l}) // and Project into aB
|> List.ofSeq // and then List
Наслаждайтесь!