2010-05-04 9 views
80

Hackage tiene varios paquetes para transformadores monad:mtl, transformadores, mónadas-fd, monadLib, y la paradoja de la elección

  • mtl: biblioteca transformador Mónada
  • transformers: functor hormigón y monad transformadores
  • monads-fd: clases Monad, utilizando las dependencias funcionales
  • monads-tf: clases Monad, utilizando familias de tipo
  • monadLib: una colección de transformadores de mónada.
  • mtl-tf: Biblioteca de transformadores Monad utilizando familias de tipos.
  • mmtl: biblioteca modular Mónada transformador
  • mtlx: Biblioteca transformador Mónada con índices de tipo, proporcionando copias de 'libre'.
  • compose-trans: transformadores Composable monad

(y tal vez me perdí algunos)

los cuales uno será usamos?

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

Pero, ¿qué tiene de malo la elección de todos modos, no es solo algo bueno?

Bueno, vi cómo, por ejemplo, los autores de datos de acceso tuvieron que hacer todo esto para atender a tan sólo las opciones más populares:

  • biblioteca-monadLib-descriptor de acceso de datos: funciones de acceso para las mónadas de monadLib
  • biblioteca
  • ficha de descriptor de acceso-mónadas-fd: uso Accessor para acceder estado en mónadas-FD Estado de clase mónada
  • biblioteca de descriptor de acceso de datos-mónadas-tf: uso Accessor para acceder estado en la familia tipo mónada Estado mónadas-tf
  • biblioteca data-accessor-mtl: use el acceso para acceder al estado i n Estado mtl clase mónada
  • biblioteca de descriptor de acceso-transformadores de datos: Uso Accessor para acceder estado en transformadores mónada Estado

me imagino que si esto sigue y sigue, por ejemplo, varios paquetes de flecha que compiten evolucionan, 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 mónada?
  • ¿Por qué mtl [consider] uncool?
  • ¿Cuáles son las principales diferencias?
  • La mayoría de estos paquetes que aparentemente compiten 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ía usted y yo debemos usar?
+2

Este enlace me ayudó a entender mtl vs transformadores http://www.haskell.org/haskellwiki/Monad_Transformer_Library –

+1

Desplácese hacia abajo para [comentario @jberryman] (http://stackoverflow.com/questions/2769487/mtl-transformers -monads-fd-monadlib-and-the-paradox-of-choice # comment8791863_2769664)! ¡Usa mtl o transfomers, se hicieron compatibles! – Sophie

Respuesta

63

Un montón de ellos son casi completamente equivalentes:

  • mtl utiliza extensiones de GHC, pero es transformers Haskell 98.
  • monads-fd y monads-tf son complementos a transformers, el uso de las dependencias funcionales y Tipo familias respectivamente, ambos proporcionan la funcionalidad en mtl que falta en transformers.
  • mtl-tf es mtl reimplementado usando el tipo de familias.

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

mmtl y mtlx ambos parecen ser similares y/o se basan en mtl, con diferencias de API y características adicionales.

MonadLib parece tener un punto de vista bastante diferente, pero no estoy familiarizado con él 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 de cosas para crear transformadores de mónada. Afirma ser compatible con Control.Monad.Trans que ... supongo que significa mtl?

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

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

if mtl == transformers ++ mónadas-fd, ¿no podría simplemente implementarse de esta manera? (como una fase para reemplazarlo) que eliminaría la necesidad de tener cosas como data-accessor-mtl – yairchu

+1

@yairchu: No son 100% compatibles, aunque, si nada más, creo que hay pequeñas diferencias en el API. El cambio no sería difícil para la mayoría de los paquetes que usan 'mtl', pero probablemente no sea algo que pueda hacerse de manera segura o en segundo plano. –

+1

@camccann: Ya veo. Pero todavía hay alguna unificación que podría hacerse de una manera compatible con versiones anteriores mediante la extracción de algunas cosas en común. La clase MonadTrans, que es exactamente la misma, se puede colocar en su propio paquete. Entonces no habrá necesidad de divisiones como MaybeT/MaybeT-transformers. Otra es Identify mónada, que incluso se recrea en TypeCompose porque Conal no quiere depender de mtl. – yairchu

20

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

Cuando eso sucede podrás 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 me gustaría escribir a mtl, pero no se basan en el hecho de que Estado, Reader, etc., son 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 con seguridad porque no comparte ningún nombre de módulo con los demás, pero que tiene un patrón de uso bastante diferente.

+4

¿Coexisten en qué sentido? Utilizado por el mismo paquete? Importado en el mismo módulo? ¿Combinado en la misma pila de transformadores? Mezclar fundeps y TFs me parece una mala idea, en general. De todos modos, no he hecho un uso extenso de 'transformers' & co. sin embargo, no notó ningún otro problema aparte de algunas diferencias menores de API vs. 'mtl' al cambiar un código (bastante simple). –

+4

El problema se reduce al hecho de que solo puede cargar un paquete que proporciona un módulo determinado. Entonces, si usa una biblioteca que usa mtl, incluso internamente, no puede importar una alternativa. Actualmente, un porcentaje saludable de pirateo utiliza el MTL internamente de alguna manera. Varias personas prefieren usar familias de tipos, y monads-tf les da eso, pero tenga en cuenta que en este momento, hasta que se complete la refactorización de transformadores + mónadas-fd, bloquea el código de utilizar cualquier biblioteca que transitivamente requiera MTL . Eso incluye algunos artículos bastante grandes. –

+1

El uso de transformadores + mónadas- (tf | fd) evitará a largo plazo esa salmuera, pero todavía no hemos llegado. Mientras tanto, la preponderancia de uso está a favor de mtl. La ruta de actualización parece ser que la próxima versión principal del mtl se redefinirá como un stub que importa mónadas-fd y transformadores. El salto de versión principal proporciona una buena manera de indicar en tu archivo cabal que no te importa qué versión obtienes (es decir, no te importa que el estado sea un tipo de alias o un tipo de datos) y una vez que ocurre el bache importante de la versión entonces no necesita importar si todas las bibliotecas que usa comparten los mismos sesgos. –

7

La factorización de Edward Kmett menciona en his answer se completó a finales de 2010. Su resultado final fue mónadas-FD, edificados sobre transformadores, convirtiéndose en la versión 2 de mtl. Como consecuencia de la omnipresencia de mtl, , las mónadas-tf nunca fueron atrapadas. A partir de principios de 2017, mtl y transformadores son las únicas bibliotecas de transformadores de mónada que tienen un uso generalizado.

Cuestiones relacionadas