(我知道这个问题,但它与序列有关,这不是我的问题)
给定此输入(例如):
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