Estoy pensando en formas de utilizar el sistema de tipos de Haskell para imponer la modularidad en un programa. Por ejemplo, si tengo una aplicación web, tengo curiosidad de saber si hay una manera de separar todo el código de la base de datos del código CGI del código del sistema de archivos del código puro.Uso del sistema de tipos de Haskell para forzar la modularidad
Por ejemplo, yo estoy imaginando una mónada DB, por lo que podría escribir funciones como:
countOfUsers :: DB Int
countOfUsers = select "count(*) from users"
me gustaría que sea imposible utilizar efectos secundarios distintos a los que el apoyo de la mónada DB. Me estoy imaginando una mónada de nivel superior que estaría limitada a manejadores de URL directos y podría componer llamadas a la mónada DB y a la mónada IO.
¿Esto es posible? ¿Es esto sabio?
actualización: Terminé lograr esto con Scala en lugar de Haskell: http://moreindirection.blogspot.com/2011/08/implicit-environment-pattern.html
¡Gracias, Don! La primera solución suena como lo que estoy buscando. ¿Conoces algún paquete específico que use esta técnica, o buenos términos para google for ("mónada IO restringida" no apareció mucho)? – Bill
Un buen ejemplo del concepto de 'mónada de contaminación', http://blog.sigfpe.com/2007/04/trivial-monad.html –
Gracias. Si elijo utilizar el patrón "mónada contaminada" para mi mónada de base de datos, ¿qué debo hacer para extraer los datos de la mónada de base de datos? ¿Mi controlador de acción HTTP tiene que usar un transformador de mónada con DB en él? – Bill