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:
mtl
usa extensiones GHC, perotransformers
es Haskell 98.monads-fd
ymonads-tf
son complementos detransformers
, utilizando dependencias funcionales y familias de tipos, respectivamente, y ambos proporcionan la funcionalidadmtl
que faltatransformers
.mtl-tf
semtl
vuelve a implementar utilizando familias tipográficas.Entonces, esencialmente,
mtl
==transformers
++monads-fd
,mtl-tf
==transformers
++monads-tf
. Creo que la portabilidad y modularidad mejoradastransformers
y sus paquetes asociados es la razón por la que nomtl
está de moda en estos días.mmtl
ymtlx
ambos parecen ser similares y / o basados enmtl
, con diferencias de API y características adicionales.MonadLib
parece 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-trans
parece ser más una metaprogramación para crear transformadores de mónadas. Dice ser compatible con loControl.Monad.Trans
que ... supongo que significamtl
.En cualquier caso, sugiero el siguiente algoritmo de decisión:
transformers
& co., Ayúdenosmtl
a descansar.mtl
en un gran proyecto?transformers
no es completamente compatible, pero nadie te matará por no cambiar.category-extras
y 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 latransformers
biblioteca se está factorizado fuera del MTL de una manera quemonads-fd
ymonads-tf
pueden coexistir en paz, pero en el cheque pasado que aún no era el caso.Cuando eso suceda, podrá importar
monads-fd
ytransformers
obtener (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,data
ya que serán reemplazados portype
s.MonadLib
es 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 frentemtl
al 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