Sì, sono equivalenti nel senso che il Option
digita insieme a Option.bind
e il tipo costruttore Some
costituiscono una monade.
Mentre le monadi (come nella classe Monad
) sono una parte centrale dell'identità di Haskells, da un punto di vista concettuale sono un costrutto indipendente dal linguaggio. Un modello di design, se vuoi. Se si dispone di un tipo e si dispone di un binding e una funzione di ritorno con firme specifiche che obbediscono a un particolare insieme di leggi, si dispone di una monade, indipendentemente dalla lingua utilizzata.
Le espressioni di calcolo F # forniscono solo uno zucchero di sintassi programmabile per le monadi, simile alla notazione in Haskell. Sebbene non sia presente un generatore di espressioni di calcolo Option
fornito in modo predefinito, è possibile definire facilmente una versione ridotta come questa:
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
E usalo in questo modo:
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
che è un equivalente zuccherato di qualcosa del genere:
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
Si noti come i membri del builder rispecchiano la classe di tipi Monad
e come si può scrivere un codice monadico, anche se convoluto, senza un builder.