Estoy buscando utilizar las mónadas para representar las consultas SQL y generar el SQL apropiado. A primera vista, esto no es un problema, parece una buena opción. Pero tengo que restringir los tipos, que pueden formar la mónada solo para productos, sin sumas, y no puedo pensar en una forma de colocar tales restricciones.¿Cómo puedo restringir un tipo (tipo?) A los tipos de producto solamente
Quiero utilizar el comprobador de tipos para garantizar que solo se puedan usar tipos representables en SQL.
Podría, supongo, usar la plantilla haskell para derivar las instancias correctas, y negarme a derivar si el tipo no encaja, pero preferiría hacerlo en el nivel de tipo. Menos posibilidades para mí de introducir errores debido a mi ignorancia.
¿Cómo podría hacer esto? En caso afirmativo, podría recomendar algunos ejemplos de lectura y/o código, por favor.
Edit: Gracias, tengo algunos buenos caminos a seguir, que requieren más lectura :) Y aquí viene un largo fin de semana.
Gracias @ehird, eso me da algo en que pensar. Y, sí, creo que restringir el tipo de resultado podría ser suficiente. La clase Product representa una fila SQL, que es el resultado de una consulta SQL SELECT, y para las consultas sin combinaciones, esto debería ser suficiente. Estoy tratando de trabajar para una mini DSL, y mi esperanza inicial era llegar a una etapa, donde el resultado de _runSQL_ es una cadena de consulta aceptable. Entonces algo como '(Product a) => runSQL :: SQL a -> a'. Dejando la ejecución de la consulta a lo que sea que haga un back-end de db. – dikini
Lo sentimos, en la figura anterior, la función def debería decir 'runSQL :: (Producto a) => SQL a -> AST a' para algunos' AST a' – dikini
Las mónadas ya no tienen que ser completamente polimórficas, con [tipos de restricciones ] (http://blog.omega-prime.co.uk/?p=127), ¿verdad? Sin embargo, no sé si estos son aplicables al problema del PO. – leftaroundabout