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?
functional-programming
monad
Onorio Catenacci
fonte
fonte
that's not the case
? Eles se parecem muito comigo.Respostas:
Lendo a documentação sobre o tipo de F #
Option
, parece que ele se comporta exatamente como oMaybe
tipo em Haskell, pois pode modelar 'nada' (None
em F #,Nothing
em Haskell) ou um valor de seu tipo de argumento (Some
em F #,Just
em Haskell).Em Haskell, no entanto,
Maybe
também é uma mônada, e o encanamento é tal que permite cálculos deMaybe
valores, retornando antecipadamenteNothing
se alguma das variáveis do cálculo forNothing
. 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 queOption
suporta 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ê usariaOption.Value
para todos os seus argumentos e agruparia todo o cálculo em uma tentativa / capturaNullReferenceException
.Portanto, embora
Option
seja semelhante aoMaybe
tipo , não é equivalente àMaybe
mônada .fonte
Monad
classe de tipo.Maybe
é um tipo de dados antigo simples, mas também é implementadoMonad
para fornecer esse comportamento "especial".map
ebind
funções do F # se comportam da mesma forma que as funçõesfmap
e os talvez de Haskellbind
. Ambos são mônadas e têm comportamento monádico equivalente. Haskell tem apenas umaMonad
classe que permite manipular mônadas, enquanto em F # elas são mais como um "padrão de design" abstrato.Sim, eles são equivalentes no sentido de que o
Option
tipoOption.bind
e o construtor de tiposSome
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:E use-o assim:
que é um equivalente açucarado de algo como isto:
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.fonte
Eles são equivalentes, e ambos são mônadas. A diferença é que uma mônada significa algo em Haskell - há uma
Monad
classe 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 elet!
edo!
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 aMonad
classe geral é) e tipos de tipos mais altos (dos quais um indivíduoMonad
é), 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 #
Option
e HaskellMaybe
são idênticos e ambas as mônadas. É que Haskell oferece muito mais máquinas para trabalhar com mônadas do que o F #.fonte