Ja, sie sind in dem Sinne äquivalent, dass der Option
Typ zusammen mit Option.bind
und der Some
Typkonstruktor eine Monade bilden.
Während Monaden (wie in der Monad
Typklasse) ein zentraler Bestandteil von Haskells Identität sind, sind sie aus konzeptioneller Sicht ein sprachunabhängiges Konstrukt. Ein Designmuster, wenn Sie möchten. Wenn Sie einen Typ haben und eine Bindungs- und eine Rückgabefunktion mit bestimmten Signaturen haben, die bestimmten Gesetzen entsprechen - Sie haben eine Monade -, unabhängig von der Sprache, die Sie verwenden.
F # -Berechnungsausdrücke bieten nur einen programmierbaren Syntaxzucker für Monaden, ähnlich der do-Notation in Haskell. Obwohl kein Option
Builder für Berechnungsausdrücke standardmäßig bereitgestellt wird, können Sie auf einfache Weise einen Bare-Bones wie diesen definieren:
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
Und benutze es so:
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
Das ist ein gezuckertes Äquivalent von so etwas:
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
Beachten Sie, wie die Builder-Mitglieder die Monad
Typklasse spiegeln und wie Sie monadischen - auch wenn verschlungenen - Code ohne Builder schreiben können.
that's not the case
? Sie sehen mir sehr ähnlich.