5

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"
4

1 に答える 1