Разделение списка на список списков на основе предиката
(Я в курсеэтот вопрос, но это касается последовательностей, что не моя проблема здесь)
Учитывая этот вход (например):
let testlist =
[
"*text1";
"*text2";
"text3";
"text4";
"*text5";
"*text6";
"*text7"
]
let pred (s:string) = s.StartsWith("*")
Я хотел бы иметь возможность позвонитьMyFunc pred testlist
и получить этот вывод:
[
["*text1";"*text2"];
["*text5";"*text6";"*text7"]
]
Это мое текущее решение, но мне не очень нравятся вложенные List.revs (игнорируйте тот факт, что он принимает Seq в качестве входных данных)
let shunt pred sq =
let shunter (prevpick, acc) (pick, a) =
match pick, prevpick with
| (true, true) -> (true, (a :: (List.hd acc)) :: (List.tl acc))
| (false, _) -> (false, acc)
| (true, _) -> (true, [a] :: acc)
sq
|> Seq.map (fun a -> (pred a, a))
|> Seq.fold shunter (false, [])
|> snd
|> List.map List.rev
|> List.rev