Como a Mônada Talvez se relaciona com o tipo de opção?

8

Eu estava fazendo uma apresentação no F # e discutia o tipo de opção quando alguém na platéia me perguntou se o tipo de opção é a implementação da mônada talvez do F #. Eu sei que não é o caso, mas eu queria perguntar como os dois conceitos estão relacionados. Quero dizer, parece-me que um tipo de opção pode ser o resultado da operação de uma mônada talvez, mas nem tenho certeza disso.

Alguém elucidaria a relação entre talvez a mônada e o tipo de opção nas linguagens funcionais que a suportam?

Onorio Catenacci
fonte
4
Apenas curioso, mas como você sabe that's not the case? Eles se parecem muito comigo.
É por isso que estou perguntando.
Onorio Catenacci

Respostas:

8

Lendo a documentação sobre o tipo de F # Option, parece que ele se comporta exatamente como o Maybetipo em Haskell, pois pode modelar 'nada' ( Noneem F #, Nothingem Haskell) ou um valor de seu tipo de argumento ( Someem F #, Justem Haskell).

Em Haskell, no entanto, Maybetambém é uma mônada, e o encanamento é tal que permite cálculos de Maybevalores, retornando antecipadamente Nothingse alguma das variáveis ​​do cálculo for Nothing. Usado dessa maneira, Maybeé um manipulador de erros simples (ou melhor, dispositivo de ignição de erros) e o fato de ser uma mônada permite mover o clichê do caminho. Veja este artigo da Wikipedia para um bom exemplo conciso. Eu não acho que Optionsuporta esse tipo de uso monádico (na verdade, estou me perguntando se existe algum conceito explícito de mônada em F #). Se você deseja esse comportamento no .NET, acho que você usaria Option.Valuepara todos os seus argumentos e agruparia todo o cálculo em uma tentativa / captura NullReferenceException.

Portanto, embora Optionseja semelhante ao Maybe tipo , não é equivalente à Maybe mônada .

tdammers
fonte
Obrigado pela explicação lúcida. Sinceramente, eu sempre considerei que eles não eram os mesmos (um é do tipo, o outro é uma mônada), mas não tinha muita certeza de como um se relacionava com o outro.
Onorio Catenacci
BTW - existe um tipo de conceito de mônada em F #; é chamado de expressão de computação.
Onorio Catenacci
@OnorioCatenacci: Ah, tudo bem. Eu não tive muita exposição ao F #, então com licença. De qualquer forma, em Haskell, as mônadas são tipos, mais especificamente, tipos da Monadclasse de tipo. Maybeé um tipo de dados antigo simples, mas também é implementado Monadpara fornecer esse comportamento "especial".
tdammers
2
em resumo: não concordo que não sejam equivalentes. construções de linguagem como classes de tipos ou polimorfismo não alteram as propriedades e estruturas matemáticas fundamentais de um tipo.
Sara
2
As opções mape bindfunções do F # se comportam da mesma forma que as funções fmape os talvez de Haskell bind. Ambos são mônadas e têm comportamento monádico equivalente. Haskell tem apenas uma Monadclasse que permite manipular mônadas, enquanto em F # elas são mais como um "padrão de design" abstrato.
Jack
9

Sim, eles são equivalentes no sentido de que o Optiontipo Option.binde o construtor de tipos Someconstituem uma mônada.

Embora as mônadas (como na Monadclasse) 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 Optionum 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 Monadclasse e como você pode escrever código monádico - mesmo que complicado - sem um construtor.

scrwtp
fonte
3

Eles são equivalentes, e ambos são mônadas. A diferença é que uma mônada significa algo em Haskell - há uma Monadclasse de tipo explícita e a "anotação" pode ser usada para eliminar muitos clichês ao escrever código monádico. Em F #, notação construtor e let!e do!pode ser usado para se livrar do clichê semelhante, mas há não uma noção explícita de um tipo de "ser uma mônada". O sistema de tipos de Haskell inclui classes de tipos (da qual a Monadclasse geral é) e tipos de tipos mais altos (dos quais um indivíduo Monadé), que permitem escrever código que funcione para todas as mônadas. O sistema de tipos do F # não possui nenhum desses recursos.

Então, sim, F # Optione Haskell Maybesão idênticos e ambas as mônadas. É que Haskell oferece muito mais máquinas para trabalhar com mônadas do que o F #.

Jack
fonte