Sim, eles são equivalentes no sentido de que o Option
tipo Option.bind
e o construtor de tipos Some
constituem uma mônada.
Embora as mônadas (como na Monad
classe) sejam uma parte central da identidade de Haskells, do ponto de vista conceitual elas são uma construção independente da linguagem. Um padrão de design, se quiser. Se você possui um tipo e possui uma função de vinculação e retorno com assinaturas específicas que obedecem a um conjunto específico de leis - você tem uma mônada - independentemente do idioma usado.
As expressões de computação do F # fornecem apenas um açúcar de sintaxe programável para as mônadas, semelhante à notação do Haskell. Embora não exista Option
um construtor de expressões de computação pronto para uso, você pode facilmente definir um esqueleto como este:
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
E use-o assim:
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
que é um equivalente açucarado de algo como isto:
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
Observe como os membros do construtor espelham a Monad
classe e como você pode escrever código monádico - mesmo que complicado - sem um construtor.
that's not the case
? Eles se parecem muito comigo.