O que é um exemplo explícito de uma mônada sem um transformador de mônada? [duplicado]

Esta pergunta já tem uma resposta aqui:

Existe uma mônada que não possui um transformador de mônada correspondente (exceto IO)? 4 respostas

Os transformadores de mônada são conhecidos por todas as mônadas padrão (Reader, Writer, State, Cont, List, etc.), mas cada um desses transformadores de mônada funciona de uma maneira ligeiramente diferente. Não há método ou fórmula geral para construir um transformador de mônada, dada a definição de um construtor de tipo com uma instância de mônada. Portanto, não é garantido que um tipo de dados de mônada projetado de acordo com alguns requisitos de negócios arbitrários tenha um transformador de mônada. Existe um exemplo tão explícito?

Trabalho relatado

Outra pergunta explica que uma composição de functor de duas mônadas não é necessariamente uma mônada. Veja tambémessa questão. Esses exemplos não respondem à presente pergunta - apenas ilustram o problema de não haver um método geral para construir um transformador de mônada. Esses exemplos mostram que, dadas duas mônadas M e N, às vezes descobriremos que M (N a) é uma mônada, às vezes N (M a) é uma mônada e, às vezes, nenhuma será uma mônada. Mas isso não mostra como construir um transformador de mônada para M ou N, nem se ele existe.

Resposta a outra pergunta argumenta que oIO mônadanão podes tem um transformador de mônada porque se tivesse umIOT, poderíamos aplicarIOT paraListe, em seguida, levantando uma lista vazia (lift []) na mônada resultante teria que desfazer os efeitos colaterais executados "anteriormente" pela mônada de IO. Este argumento baseia-se na ideia de que oIO a mônada "realmente realiza" efeitos colaterais que, presumivelmente, não podem ser desfeitos. No entanto, oIO Mônada não é um construtor de tipo explícito.

Discussão

Em todo exemplo em que um tipo de mônada é fornecido explicitamente, um transformador de mônada pode ser encontradode alguma forma, - às vezes com certa ingenuidade necessária. Por exemplo, oListT O transformador existente na biblioteca Haskell erarelativamente recentemente considerado incorreto de maneira sutil, mas o problema foi resolvido com a alteração da definição deListT.

Exemplos padrão de mônadas sem transformadores são mônadas comoIO, que na verdade não é definido por um construtor de tipo explícito -IO é um tipo "mágico" opaco definido pela bibliotecade alguma forma, em nível baixo. Parece claro que umnão podes definirIO como um construtor de tipo explícito, com uma instância de mônada fornecida por funções puras. oIO O exemplo mostra que um transformador de mônada pode deixar de existir se permitirmos que a instância de mônada contenha código oculto de baixo nível com efeitos colaterais impuros. Portanto, vamos limitar nossa atenção às mônadas implementadas usando funções puras.

Parece não haver um algoritmo que derivaria automaticamente os transformadores de mônada do código-fonte da mônada. Sabemos mesmo que isso sempre é possível?

Para deixar mais claro o que quero dizer com "exemplo explícito" de uma mônada: suponha que afirmo que

 type Q u v a = ((u -> (a, Maybe a)) -> v) -> u -> (a, Maybe a)

pode ter um legalMonad instância com relação ao parâmetro typeae produzo o código fonte para uma implementação doMonad instância paraQ u v como funções purasreturn ejoin. Então sabemos queQ u v tem um transformador de mônadaQT u v de tal modo queQT u v Id é equivalente aQ u v, e as leis dos transformadores de mônada são válidas? Então sabemos como construirQT explicitamente? Eu não.

Para decidir esta questão, precisamos:

demonstrar um algoritmo que encontraria um transformador de mônada a partir de um construtor de tipo determinado arbitrário e uma determinada implementação de uma instância de mônada; por exemplo. dado o códigotype F a = r -> Either (a, a) (a, a, Maybe a) e uma implementação de uma instância de mônada para isso, para encontrar o código para o transformador de mônada; vamos nos limitar a digitar construtores feitos de qualquer combinação de->, tupla eEither Pela simplicidade; oupara demonstrar um contraexemplo: umexplícito construtor do tipo mônada, fornecido por uma definição de código explícita, por exemplotype F a = r -> Either (a, a, a) (a, a, Maybe a) ou o que seja, de modo que seja legalMonad, com umMonad exemplo dado por funções puras, mas podemosprovar esteF não possui transformador de mônada.

questionAnswers(1)

yourAnswerToTheQuestion