Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Seria o nosso Maybe realmente uma mônada?

Não conheço muito de programação funcional, mas eu tinha entendido que para ser uma mônada era necessário dois métodos:

1 - O 'return', que no nosso caso seria o construtor ou o método 'of'.

2 - O 'bind' (flatMap em outras linguagens), que seria uma função de um valor para uma mônada.

No nosso caso, o Maybe não seria apenas um Functor, porque possui apenas o método map?

Essa dúvida é mais curiosidade mesmo, entendo que nos exemplos e no uso isso não fez diferença.

5 respostas

Fala Vinicius! Tudo bom?

O Maybe realmente é uma mônada.

O Maybe é uma implementação do Data.Maybe do Haskell. A ideia é prover uma mônada "ao redor" (wrap) do dado que pode ou não existir em runtime.

Espero ter ajudado!

Abraços e bons estudos!

Oi Paulo.

Talvez não tenha ficado muito claro, mas meu questionamento é que, como tempos apenas o método map, e não o método 'bind', então a nossa implementação seria apenas um Functor, e não uma mônada.

Poderia a nossa implementação ser uma mônada, mesmo sem ter esse método? Note que a implementação de Haskell possui o 'bind' e o 'return', e a implementação do bind é diferente da implementação do map (as suas assinaturas são distintas também).

Oi Vinícius!

A classe Maybe que foi criada nada mais é que uma estrutura que embrulha um valor. para a interação com esse valor, foi utilizado o método map, algo que se coaduna a ideia de Functor, que você já viu! Portanto a Maybe Monad é um Functor por natureza (mônada é um functor para um tipo). Portanto a resposta para sua pergunta é sim, a classe criada é uma mônada. Existem alguns outros métodos que podem ser implementados de acordo com a necessidade, mas não é necessário que todos existam para que se torne uma mônada (ex: chain)

Existe um post bem bacana (porém em inglês) que fala bastante sobre mônadas, acho que você vai gostar

clique aqui

Espero ter ajudado na sua jornada meu amigo!

Abraços e bons estudos!

Oi Paulo.

Gostei bastante do post, mas parece que reafirma o que eu falei.

Na seção "Maybe of a Maybe? Maybe not", ele toca no ponto mais importante do uso das mônadas (na minha opinião): a composição de funções que retornam valores monádicos.

Note que quando ele cria a função getProvinceBanner, ele retorna um Maybe do valor. E essa função não é facilmente mapeável, pois você acaba ficando com dois níveis de Maybe (como mostrado no post). Pra resolver isso ele cria os métodos join e chain. O método chain é, exatamente, a implementação do método bind em Haskell. Ele possibilita o encadeamento de funções que retornam valores monádicos em uma mônada só no final.

Além disso, se pensarmos um pouco mais, a existência do método chain, por exemplo, dá o poder de transformar um Maybe de um valor em um Maybe vazio, de acordo com o valor dentro do Maybe. Isso porque o chain recebe um parâmetro e retorna um Maybe.

Agora veja a diferença com o método map, por exemplo: ele recebe um valor de um tipo e retorna outro tipo. A priori (sem o flatMap), não é possível mudar o tipo do Maybe onde o map é chamado (pois se o map retornar um Maybe temos o problema de dois Maybes aninhados, e temos que usar o join).

O ponto que eu levanto, e que o autor no post não endereçou diretamente, é que, sem o método chain ou o método join, não temos, efetivamente, uma mônada: temos apenas um functor, e devemos, manualmente, desembrulhar os valores.

De qualquer forma a discussão foi bastante válida, pois acabei vendo outras páginas pra entender melhor esse assunto.

solução!

Boa tarde, Vinicius! Como vai?

O que acontece é que durante o curso o mestre Flávio usou uma definição mais simplificada tanto de functor quanto de mônada. Ele disse que functor é alguém que tem a função map() e que mônada é um functor que armazena um valor e que te dá a possibilidade de pegar esse valor de volta em algum momento. Essas definições que ele fez podem ser vistas nessa aula e nessa outra aula. Inclusive, em alguns casos onde não se deseja descer tão a fundo nesse assunto de forma teórica, essas são as definições normalmente usadas.

Portanto, tendo em vista essas definições simplificadas, o Maybe criado é uma mônada pois é um functor que encapsula um valor e dá a possibilidade de obter esse valor de volta em algum momento.

Ou seja, no final das contas, tudo gira em torno da simplificação que o Flávio fez para fazer a explicação desse assunto.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!