私はこのストレートMaybe
モナドを実装しようとしました。したがって、基本的には、中間ステップの1つがNothing
の場合、式全体がNothing
と評価されます。F#計算式がコンバインと呼ばれるとき
type Maybe<'a> =
| Just of 'a
| Nothing
type MaybeBuilder() =
member this.Combine ((first, second) : Maybe<'a> * Maybe<'b>) : Maybe<'b> =
printfn "Combine called"
match first with
| Nothing -> Nothing
| _ ->
match second with
| Nothing -> Nothing
| _ as a -> a
member this.Zero() = Just()
member this.Bind((m, f) : Maybe<'a> * ('a -> Maybe<'b>)) =
printfn "Bind called"
match m with
| Nothing -> Nothing
| Just a -> f a
let MaybeMonad = MaybeBuilder()
let foobar =
MaybeMonad {
let! foo = Just "foo"
Just 1
Nothing
}
私はfoobar
がしかしCombine
が呼び出されなかった、Just "foo" >>= fun foo -> Combine(Just 1, Nothing)
に変換することが期待されます。
この非常に良いシリーズの記事をフォローアップしてください:https://fsharpforfunandprofit.com/series/computation-expressions.html – rmunn