None オプションが受信されるまで処理するachooseTill
または a のようなことを行う方法は既にありますか? foldTill
実際、「til」オプションを使用した高階関数のいずれかです。確かに、マップのようなものには意味がありませんが、この種のものがかなり頻繁に必要であることに気づき、車輪を再発明していないことを確認したかった.
一般に、このようなものを書くのはかなり簡単ですが、これを行う方法が既にあるかどうか、またはこれが既知のライブラリに存在するかどうかに興味がありますか?
let chooseTill predicate (sequence:seq<'a>) =
seq {
let finished = ref false
for elem in sequence do
if not !finished then
match predicate elem with
| Some(x) -> yield x
| None -> finished := true
}
let foldTill predicate seed list =
let rec foldTill' acc = function
| [] -> acc
| (h::t) -> match predicate acc h with
| Some(x) -> foldTill' x t
| None -> acc
foldTill' seed list
let (++) a b = a.ToString() + b.ToString()
let abcdef = foldTill (fun acc v ->
if Char.IsWhiteSpace v then None
else Some(acc ++ v)) "" ("abcdef ghi" |> Seq.toList)
// result is "abcdef"