A expressão de computação é igual à mônada?

22

Ainda estou aprendendo programação funcional (com f #) e recentemente comecei a ler sobre expressões de computação. Ainda não entendo completamente o conceito e uma coisa que me mantém insegura ao ler todos os artigos sobre mônadas (a maioria deles é escrita com base em Haskell) é a relação entre expressões computacionais e mônadas.

Tendo escrito tudo isso, aqui está a minha pergunta (duas perguntas, na verdade):

Toda expressão de computação em F # é uma mônada? Cada mônada pode ser expressa com a expressão de computação F #?

Eu li este post do Tomas Petricek e, se o entendo bem, afirma que as expressões de computação são mais do que mônadas, mas não tenho certeza se interpreto isso corretamente.

Grzegorz Sławecki
fonte
@ Rafael, posso perguntar qual é o motivo da remoção da tag lang?
Grzegorz Sławecki
2
Como nos preocupamos com conceitos, tentamos manter a maioria das coisas independentes da linguagem aqui. Eu não sei o que a remoção de F # faz a pergunta ( eu acho que se é importante que o F #, em seguida, a questão é offtopic aqui, mas é um caso limite) então eu só remover a tag # F. Regra básica: F # não é um conceito de CS; portanto, não precisa de uma tag. (Sim, eu estou ciente de outras tags PL e eu não gosto deles, quer para algumas perguntas, a comunidade decidiu que justificam essas tags..)
Raphael
1
@ Rafael Eu acredito que a questão é realmente um caso limítrofe. Alguém decidiu migrar para cá, mas parece que também está um pouco fora de tópico. A pergunta em si é um tipo de computador, mas, ao mesmo tempo, as respostas e a pergunta estão especificamente relacionadas ao f #. Compreendo sua regra de ouro, obrigado por esclarecimentos.
Grzegorz Sławecki

Respostas:

22

Antes de tudo, expressões de computação são uma característica da linguagem, enquanto mônadas são abstrações matemáticas, portanto, deste ponto de vista, são coisas completamente diferentes .

Mas isso não seria uma resposta muito útil :-). Expressões de computação são um recurso de linguagem que fornece uma sintaxe que pode ser usada para programação com cálculos (ou tipos de dados) que possuem a estrutura monádica, mas também podem ser usados ​​com outras estruturas. Você pode ler meu artigo do zoo de expressões de computação em F # para obter mais detalhes, mas as expressões de computação podem ser usadas com:

  • Mônadas, mas também mônadas aditivas (o que os Haskellers chamam MonadPlusou MonadOr)
  • Cálculos compostos (o que os Haskellers chamam de transformadores de mônada)
  • Computações que são monádicas, mas suportam outras construções de F # como manipulação de exceção
  • Monoides (e algumas variações sem ligação monádica)
  • Funtors aplicáveis ​​(embora isso só seja implementado em uma extensão de pesquisa)

Portanto, as expressões de computação certamente estão intimamente ligadas às mônadas, mas não estão intimamente ligadas a elas. Isso contrasta, por exemplo, com a donotação de Haskell , que está muito mais intimamente ligada às mônadas (embora isso possa ser usado com cálculos que não são estritamente matematicamente mônadas).

Tomas Petricek
fonte
3
Os transformadores de mônada são uma maneira genérica de converter uma mônada em outra mônada - as expressões de computação F # realmente suportam diretamente a implementação direta do / result / dessa transformação, em vez da própria transformação.
GS - Desculpe-se com Monica
1
@GaneshSittampalam - Sim, você está correto. Minha tentativa de simplificar não foi tão útil aqui :-). Expressões de cálculo pode dar-lhe uma sintaxe para trabalhar com um cálculo que é o resultado da aplicação de uma mônada transformador (com a sintaxe potencialmente diferente para a Mônada subjacente e para a Mônada composta)
Tomas Petricek
5

Você pode usar expressões de computação para expressar mônadas. Há um exemplo aqui . Além disso, como você observou, você pode usar expressões de computação para muito mais do que apenas mônadas. Há uma explicação estendida sobre como eles são diferentes aqui . Não há espaço aqui para explicar a diferença adequadamente, mas as expressões de computação são diferentes das mônadas, pois reutilizam a sintaxe F # normal e têm a capacidade de adicionar abstrações adicionais. Uma limitação é que é não-idiomático (e difícil) escrever uma expressão de computação que é polimórfica sobre o tipo de computação.

N / D
fonte
1
Torne sua resposta mais autônoma, resumindo pelo menos o material nas páginas às quais você vincula. Sua resposta atual será completamente sem sentido se os dois links pararem de funcionar.
David Richerby
2
Não tenho certeza do que você está falando. Respondi explicitamente às perguntas e depois dei links para mais informações, se o solicitante estiver interessado. Os links não são necessários para responder à pergunta.
N_A
1
Não posso sequer imaginar que os dois links poderia parar de trabalhar :-)
Tomas Petricek