Hackage tiene varios paquetes para transformadores de mónadas:
- mtl : biblioteca de transformadores Monad
- transformadores : functor de hormigón y transformadores de mónada
- monads-fd : clases de mónadas , usando dependencias funcionales
- monads-tf : clases de mónadas , utilizando familias de tipos
- monadLib : una colección de transformadores de mónada.
- mtl-tf : biblioteca de transformadores de mónadas que utiliza familias de tipos.
- mmtl : biblioteca de transformadores Modular Monad
- mtlx : biblioteca de transformadores Monad con índices de tipo, que proporciona copias 'gratuitas'
- compose-trans : transformadores de mónada componibles
(y tal vez me perdí algunos)
¿Cuál usaremos?
mtl es el de la plataforma Haskell, pero sigo escuchando en reddit que no es genial.
Pero lo malo de la elección de todos modos, ¿no es solo algo bueno?
Bueno, vi cómo, por ejemplo, los autores de data-accessor tuvieron que hacer todo esto para atender solo las opciones populares:
- biblioteca data-accessor-monadLib: funciones de acceso para las mónadas de monadLib
- biblioteca data-accessor-monads-fd: use Accessor para acceder al estado en la clase monad State monads-fd
- biblioteca data-accessor-monads-tf: Utilice Accessor para acceder al estado en la familia de tipos de mónadas de estado monads-tf
- biblioteca data-accessor-mtl: use Accessor para acceder al estado en la clase mtl State monad
- biblioteca data-accessor-transformers: use Accessor para acceder al estado en la mónada de estado de los transformadores
Me imagino que si esto continúa y, por ejemplo, evolucionan varios paquetes de Arrow de la competencia, podríamos ver algo como: Spoonklink-Arrow-Transformers, Spoonklink-Arrow-MonadLib, Spoonklink-tfArrows-Transformers, Spoonklink-tfArrows-monadLib, ...
Y luego me preocupa que si se bifurca Spoonklink, Hackage se quedará sin espacio en disco. :)
Preguntas:
- ¿Por qué hay tantos paquetes de transformadores de mónadas?
- ¿Por qué mtl [se considera] poco cool?
- ¿Cuáles son las diferencias clave?
- La mayoría de estos paquetes aparentemente competidores fueron escritos por Andy Gill y son mantenidos por Ross Paterson. ¿Significa esto que estos paquetes no compiten sino que funcionan juntos de alguna manera? ¿Y Andy y Ross consideran obsoleto alguno de sus propios paquetes?
- ¿Cuál deberíamos usar tú y yo?
haskell
monads
monad-transformers
yairchu
fuente
fuente

Respuestas:
Algunos de ellos son casi completamente equivalentes:
mtlusa extensiones GHC, perotransformerses Haskell 98.monads-fdymonads-tfson complementos detransformers, utilizando dependencias funcionales y familias de tipos, respectivamente, y ambos proporcionan la funcionalidadmtlque faltatransformers.mtl-tfsemtlvuelve a implementar utilizando familias tipográficas.Entonces, esencialmente,
mtl==transformers++monads-fd,mtl-tf==transformers++monads-tf. Creo que la portabilidad y modularidad mejoradastransformersy sus paquetes asociados es la razón por la que nomtlestá de moda en estos días.mmtlymtlxambos parecen ser similares y / o basados enmtl, con diferencias de API y características adicionales.MonadLibparece tener una visión bastante diferente de las cosas, pero no estoy familiarizado con él directamente. También parece utilizar muchas extensiones GHC, más que las demás.A simple vista,
compose-transparece ser más una metaprogramación para crear transformadores de mónadas. Dice ser compatible con loControl.Monad.Transque ... supongo que significamtl.En cualquier caso, sugiero el siguiente algoritmo de decisión:
transformers& co., Ayúdenosmtla descansar.mtlen un gran proyecto?transformersno es completamente compatible, pero nadie te matará por no cambiar.category-extrasy resuelve todos los problemas del mundo con una página y media de un código increíblemente genérico eincomprensible y abstracto.fuente
¿Por el momento? Probablemente deberías usar
mtl. Lo que ocurre es que latransformersbiblioteca se está factorizado fuera del MTL de una manera quemonads-fdymonads-tfpueden coexistir en paz, pero en el cheque pasado que aún no era el caso.Cuando eso suceda, podrá importar
monads-fdytransformersobtener (casi) la misma interfaz, con la excepción de queState, etc. será un alias paraStateT.Así que escribiría a
mtl, pero no confiaría en el hecho de que State, Reader, etc. son actualmente,dataya que serán reemplazados portypes.MonadLibes otra alternativa en la que ha estado trabajando Iavor, que se puede utilizar de forma segura porque no comparte ningún nombre de módulo con los demás, pero que tiene un patrón de uso bastante diferente.fuente
transformers& co. todavía, pero no noté ningún problema aparte de algunas diferencias menores de API frentemtlal cambio de código (bastante simple).El factoring que Edward Kmett menciona en su respuesta se completó a finales de 2010. Su resultado final fue monads-fd , construido sobre transformadores , convirtiéndose en la versión 2 de mtl . Como consecuencia de la ubicuidad de mtl , las mónadas-tf nunca se pusieron de moda . A principios de 2017, mtl y transformers son las únicas bibliotecas de transformadores de mónadas que tienen un uso generalizado.
fuente