Me gustaría saber de alguien con una comprensión más profunda que yo las diferencias fundamentales entre Enumerators, Conduits y Pipes, así como los principales beneficios y desventajas. Algunos discussion's alreadyongoing pero sería bueno tener una visión general de alto nivel.¿Cuáles son los pros y los contras de los enumeradores frente a los conductos frente a los tubos?
Respuesta
Los enumeradores/Iteratos como abstracción fueron inventados por Oleg Kiselyov. Proporcionan una forma limpia de hacer IO con requisitos de recursos predecibles (bajos). El paquete de Enumerators actual es bastante similar al trabajo original de Oleg.
Los conductos se crearon para el marco web Yesod. Tengo entendido que fueron diseñados para ser increíblemente rápidos. Las primeras versiones de la biblioteca eran muy explícitas.
Las tuberías se centran en la elegancia. Tienen un solo tipo en lugar de varios, forman instancias de mónada (transformador) y categoría, y tienen un diseño muy "funcional".
Si te gusta explicaciones categóricas: el tipo Pipe
es sólo la mónada gratuita a través de la siguiente funtor sencilla impíos
data PipeF a b m r = M (m r) | Await (a -> r) | Yield b r
instance Monad m => Functor (PipeF a b m) where
fmap f (M mr) = M $ liftM mr
fmap f (Await g) = Await $ f . g
fmap f (Yield b p) = Yield b (f p)
--Giving:
newtype Pipe a b m r = Pipe {unPipe :: Free (PipeF a b m) r}
deriving (Functor, Applicative, Monad)
--and
instance MonadTrans (Pipe a b) where
lift = Pipe . inj . M
En la definición tubería actual éstos se cuecen en, pero la simplicidad de esta definición es increíble. Las tuberías forman una categoría en la operación (<+<) :: Monad m => Pipe c d m r -> Pipe a b m r -> Pipe a d m r
que toma la primera tubería yields
y la envía a la segunda tubería en espera.
Parece que Conduits
se mueve a ser más Pipe
como (usando CPS en lugar de estado, y el cambio a un solo tipo), mientras que los tubos están ganando apoyo para un mejor manejo de errores, y tal vez el regreso de los tipos separados para los generadores y consumidores .
Esta área se está moviendo rápidamente. He estado pirateando una variante experimental de la biblioteca Pipe con estas características, y sé que otras personas también (ver el paquete Guarded Pipes en Hackage), pero sospecho que Gabriel (el autor de Pipes) las resolverá antes que yo. hacer.
Mis recomendaciones: si está utilizando Yesod, utilice Conductos. Si quieres una biblioteca madura usa Enumerator. Si te preocupas por la elegancia, utiliza Pipe.
Después de escribir aplicaciones con las tres bibliotecas, creo que la mayor diferencia que he visto es cómo se maneja la finalización de recursos. Por ejemplo, Pipes divide la finalización del recurso en tipos separados de marcos y pilas.
También parece haber aún cierto debate sobre cómo no solo finalizar el recurso de entrada, sino también potencialmente el recurso de salida. Por ejemplo, si está leyendo desde un DB y está escribiendo en un archivo, la conexión para el DB debe cerrarse, así como el archivo de salida que necesita ser enjuagado y cerrado. Las cosas se ponen feas cuando se decide cómo manejar excepciones y casos de fallas a lo largo de la tubería.
Otra diferencia más sutil parece ser cómo se maneja y se calcula el valor de retorno de la tubería del enumerador.
Muchas de estas diferencias y posibles incoherencias han quedado al descubierto por el uso de las implementaciones Monad y Category para Pipes y ahora están abriéndose paso en Conduits.
- 1. Objeto de solicitud, ¿cuáles son los pros y los contras?
- 2. ¿Cuáles son los pros y los contras de usar Global.asax?
- 3. ¿Cuáles son los pros y los contras de la UCI?
- 4. ¿Cuáles son los pros y los contras de Solr & ElasticSearch?
- 5. ¿Cuáles son los pros y los contras de TreeSet
- 6. ¿Cuáles son los pros y los contras de la burla de rspec frente a otros marcos de burla?
- 7. ¿Cuáles son los pros y los contras de los submódulos de git y Repo?
- 8. ¿Cuáles son los pros y los contras de los procedimientos de llamada en VB.NET?
- 9. ¿ARC o no a ARC? ¿Cuáles son los pros y los contras?
- 10. ¿Cuáles serían los pros y los contras de los datos jerárquicos frente a los datos relacionados, en el rendimiento (y la categorización)?
- 11. ¿Cuáles son los pros y los contras de DynamoDB con respecto a otras bases de datos NoSQL?
- 12. ¿Cuáles son los pros y los contras de asset_packager y Jammit?
- 13. ¿Cuáles son los pros/contras de 64 bit .NET?
- 14. ¿Cuáles son los pros y los contras de la eliminación y las actualizaciones en cascada?
- 15. ¿Cuáles son los pros y los contras de las bases de datos de objetos?
- 16. ¿Cuáles son los pros y los contras de la entrada delimitada general de Ruby? (sintaxis porcentual)
- 17. ¿Cuáles son los pros y los contras de usar una enumeración de banderas?
- 18. ¿Cuáles son los pros y los contras de almacenar archivos en una base de datos?
- 19. ¿Cuáles son los pros y los contras de usar configChanges = "orientation" para dispositivos Android?
- 20. ¿Cuáles son los pros y los contras de usar un correo electrónico como nombre de usuario?
- 21. ¿Cuáles son los pros y los contras de adoptar HTML 5 ahora para rediseñar un sitio?
- 22. ¿Cuáles son los pros y los contras de dejar que Google aloje jQuery para mí?
- 23. ¿Cuáles son los pros y los contras para usar un contenedor de IOC?
- 24. ¿Cuáles son los pros y los contras de usar Castle Active Record vs Straight NHibernate?
- 25. ¿Cuáles son los pros y los contras de la autentificación HTTP básica
- 26. ¿Cuáles son los pros y los contras de un sitio 100% HTTPS?
- 27. ¿Cuáles son los pros y los contras de OleDB versus SQLClient?
- 28. ¿Cuáles son los pros y los contras de ejecutar un trabajo en Hadoop usando varios idiomas?
- 29. ¿Cuáles son los pros y los contras de usar git-svn?
- 30. ¿Cuáles son los pros y los contras de fs.createReadStream vs fs.readFile en node.js?
Los conductos y las tuberías aún están siendo sometidos a una gran revisión, por lo que es difícil compararlos y contrastarlos hasta que se estabilicen. En la situación ideal, los conductos y tuberías se fusionarán en la forma correcta de hacer enumeradores. –