O Hackage tem vários pacotes para transformadores monad:
- mtl : Biblioteca do transformador Monad
- transformadores : functor de concreto e transformadores monad
- monads-fd : classes Monad, usando dependências funcionais
- monads-tf : classes Monad, usando famílias de tipo
- monadLib : uma coleção de transformadores monad.
- mtl-tf : Biblioteca de transformadores Monad usando famílias de tipos.
- mmtl : Biblioteca de transformador Modular Monad
- mtlx : Biblioteca do transformador Monad com índices de tipo, fornecendo cópias 'gratuitas'.
- compose-trans : transformadores monádicos composíveis
(e talvez eu tenha perdido alguns)
Qual devemos usar?
mtl é aquele na plataforma Haskell, mas eu continuo ouvindo no reddit que não é legal.
Mas o que há de ruim na escolha, não é apenas uma coisa boa?
Bem, eu vi como, por exemplo, os autores do data-accessor tiveram que fazer tudo isso para atender apenas às escolhas populares:
- Biblioteca data-accessor-monadLib: funções de acesso para mônadas do monadLib
- Data-accessor-monads-fd library: use Accessor para acessar o estado na classe monads-fd State monad
- Data-accessor-monads-tf library: use o Accessor para acessar o estado na família do tipo monads-tf State monad
- biblioteca data-accessor-mtl: use o Accessor para acessar o estado na classe mtl State monad
- Data-accessor-transformers library: Use Accessor para acessar o estado em transformadores State monad
Eu imagino que se isso continuar e, por exemplo, vários pacotes concorrentes de Arrow evoluírem, poderemos ver algo como: spoiler-arrow-transformers, spoiler-flechas-monadLib, spoiler-tfArrows-transformers, spoiler-tfArrows-monadLib, ...
E então me preocupo que, se o spoiler do link for bifurcado, o Hackage ficará sem espaço em disco. :)
Questões:
- Por que existem tantos pacotes de transformadores monad?
- Por que o mtl [considerado] não é legal?
- Quais são as principais diferenças?
- A maioria desses pacotes aparentemente concorrentes foi escrita por Andy Gill e é mantida por Ross Paterson. Isso significa que esses pacotes não são concorrentes, mas funcionam juntos de alguma forma? E Andy e Ross consideram algum de seus próprios pacotes obsoleto?
- Qual você e eu devemos usar?
haskell
monads
monad-transformers
Yairchu
fonte
fonte
Respostas:
Vários deles são quase completamente equivalentes:
mtl
usa extensões GHC, mastransformers
é Haskell 98.monads-fd
emonads-tf
são complementostransformers
, usando dependências funcionais e famílias de tipo respectivamente, ambos fornecendo a funcionalidademtl
que está faltando emtransformers
.mtl-tf
émtl
reimplementado usando famílias de tipo.Então, essencialmente,
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. A portabilidade e modularidade aprimoradas dotransformers
e de seus pacotes associados é o motivo pelo qual nãomtl
é legal hoje em dia, eu acho.mmtl
emtlx
ambos parecem ser semelhantes e / ou baseados emmtl
, com diferenças de API e recursos extras.MonadLib
parece ter uma visão bastante diferente sobre os assuntos, mas não estou familiarizado com isso diretamente. Também parece usar muitas extensões GHC, mais do que as outras.À primeira vista,
compose-trans
parece mais algo de metaprogramação para a criação de transformadores de mônadas. Afirma ser compatível com oControl.Monad.Trans
que ... acho que significamtl
?De qualquer forma, sugiro o seguinte algoritmo de decisão:
transformers
& co., Ajude-nosmtl
a descansar.mtl
em um grande projeto?transformers
não é totalmente compatível, mas ninguém vai te matar por não trocar.category-extras
e resolva todos os problemas do mundo com uma página e meia de código genéricoincompreensível e sem sentido abstrato.fonte
Para o momento? Você provavelmente deve usar
mtl
. O que está acontecendo é que atransformers
biblioteca está sendo fatorada fora do MTL de uma forma que podemonads-fd
emonads-tf
pode coexistir pacificamente, mas, finalmente, verifique se ainda não era o caso.Quando isso acontecer, você poderá importar
monads-fd
etransformers
obter (quase) a mesma interface, com a exceção de queState
, etc. será um apelido paraStateT
.Então, eu escreveria para
mtl
, mas não dependeria do fato de que State, Reader, etc. estão atualmentedata
como serão substituídos portype
s.MonadLib
é outra alternativa na qual Iavor vem trabalhando, que pode ser usada com segurança porque não compartilha nenhum nome de módulo com os outros, mas que tem um padrão de uso bastante diferente.fonte
transformers
& co. ainda, mas não notei nenhum problema além de algumas pequenas diferenças de API vs.mtl
ao alternar algum código (bastante simples).A fatoração mencionada por Edward Kmett em sua resposta foi concluída no final de 2010. Seu resultado final foi monads-fd , construída sobre transformadores , tornando-se a versão 2 do mtl . Como consequência da onipresença do mtl , as mônadas-tf nunca se popularizaram. No início de 2017, mtl e transformadores são as únicas bibliotecas de transformadores monad que têm uso generalizado.
fonte