haskell monads monad-transformers

haskell - mtl, transformadores, mónadas-fd, monadLib y la paradoja de elección



monads monad-transformers (3)

Hackage tiene varios paquetes para transformadores de mónada:

  • mtl : biblioteca transformadora Monad
  • transformers : functores de hormigón y transformadores de mónada
  • monads-fd : clases de Monad, utilizando dependencias funcionales
  • monads-tf : clases de Monad, utilizando familias de tipos
  • monadLib : una colección de transformadores de mónada.
  • mtl-tf : biblioteca de transformadores Monad utilizando familias de tipos.
  • mmtl : biblioteca de transformadores Modular mmtl
  • mtlx : biblioteca de transformadores mtlx con índices de tipo, proporcionando copias ''gratuitas''.
  • compose-trans : transformadores de mónada compostables

(y tal vez me perdí algo)

¿Cuál debemos usar?

mtl es el de la plataforma Haskell, pero sigo escuchando en reddit que no es genial.

Pero lo que es malo acerca de la elección de todos modos, ¿no es solo algo bueno?

Bien, vi cómo, por ejemplo, los autores del acceso a datos tenían que hacer todo esto para atender solo las opciones populares:

  • biblioteca de data-accessor-monadLib: Funciones de acceso para las mónadas de monadLib
  • biblioteca data-accessor-monads-fd: use el acceso para acceder al estado en monad-fd State monad class
  • biblioteca data-accessor-monads-tf: use el acceso para acceder al estado en mónadas-tf Familia tipo mónada de estado
  • biblioteca data-accessor-mtl: use el acceso para acceder al estado en mtl State monad class
  • biblioteca de transformadores de acceso de datos: utilice el acceso para acceder al estado en transformadores Mónada de estado

Imagino que si esto continúa y, por ejemplo, evolucionan varios paquetes de Arrow competidores, podríamos ver algo como: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...

Y luego me preocupa que si spoonklink se bifurca, Hackage se quedará sin espacio en disco. :)

Preguntas:

  • ¿Por qué hay tantos paquetes de transformadores de mónada?
  • ¿Por qué mtl [considerado] es poco atractivo?
  • ¿Cuáles son las diferencias clave?
  • La mayoría de estos paquetes aparentemente competitivos fueron escritos por Andy Gill y son mantenidos por Ross Paterson. ¿Significa esto que estos paquetes no compiten, sino que funcionan de alguna manera? ¿Y Andy y Ross consideran que alguno de sus paquetes es obsoleto?
  • ¿Cuál deberías usar tú y yo?

¿Por el momento? Probablemente deberías usar mtl . Lo que está sucediendo es que la biblioteca de transformers está siendo excluida de la MTL de una manera que las monads-fd y las monads-tf pueden coexistir pacíficamente, pero al final comprobaron que aún no era el caso.

Cuando eso suceda, podrá importar monads-fd y transformers y obtener (casi) la misma interfaz, con la excepción de que State , etc. será un alias para StateT .

Así que escribiría en mtl , pero no confío en el hecho de que State, Reader, etc. son data actualmente data ya que serán reemplazados por type s.

MonadLib es otra alternativa en la que Iavor ha estado trabajando, que se puede usar 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.


El factor que Edward Kmett menciona en su respuesta se completó a fines de 2010. Su resultado final fue mónadas-fd , construido sobre transformadores , convirtiéndose en la versión 2 de mtl . Como consecuencia de la ubicuidad de mtl , las mónadas nunca se entendieron realmente. A principios de 2017, mtl y los transformadores son las únicas bibliotecas de transformadores de mónada que tienen un uso generalizado.


Un grupo de ellos es casi completamente equivalente:

  • mtl usa extensiones de GHC, pero los transformers son Haskell 98.
  • monads-fd y las monads-tf son complementos para los transformers , utilizando dependencias funcionales y familias de tipos respectivamente, ambas proporcionan la funcionalidad en mtl que falta en los transformers .
  • mtl-tf se mtl implementar mtl utilizando familias de tipos.

Así que esencialmente, mtl == transformers ++ monads-fd , mtl-tf == transformers ++ monads-tf . La portabilidad mejorada y la modularidad de los transformers y sus paquetes asociados es la razón por la que mtl está de moda hoy en día, creo.

mmtl mtlx como mtlx parecen ser similares y / o están basados ​​en mtl , con diferencias de API y características adicionales.

MonadLib parece tener una MonadLib bastante diferente de los asuntos, pero no estoy familiarizado con esto directamente. También parece usar muchas extensiones de GHC, más que las demás.

De un vistazo, compose-trans parece ser más como metaprogramación para crear transformadores de mónada. Afirma ser compatible con Control.Monad.Trans que ... Supongo que significa mtl ?

En cualquier caso, sugeriría el siguiente algoritmo de decisión:

  • ¿Necesitas mónadas estándar para un nuevo proyecto? Usa transformers & co., Ayúdanos a descansar mtl .
  • ¿Ya estás usando mtl en un proyecto grande? transformers no es completamente compatible, pero nadie te matará por no cambiar.
  • ¿Uno de los otros paquetes proporciona funcionalidad inusual que necesita? Bien podría usarlo en lugar de enrollar el suyo.
  • Aún insatisfecho? Tíralos a todos, descarga category-extras y resuelve todos los problemas del mundo con una página y media de código incomprensible y sin sentido, increíblemente absurdo .