Sto cercando di utilizzare le comprensione di monad per rappresentare query SQL e generare l'SQL appropriato. A prima vista, questo non è un problema, sembra una buona misura. Ma devo limitare i tipi, che possono formare la monade solo per i prodotti, senza somme, e non riesco a pensare a un modo per porre tali vincoli.Come posso vincolare un tipo (tipo?) Solo ai tipi di prodotto
Desidero utilizzare il controllo di tipo per garantire che possano essere utilizzati solo i tipi rappresentabili in SQL.
Potrei, suppongo, utilizzare template haskell per ricavare le istanze corrette e rifiutare di derivare se il tipo non si adatta, ma preferirei farlo a livello di testo. Meno possibilità per me di introdurre bug dovuti alla mia ignoranza.
Come posso fare questo? Se sì, potresti raccomandare alcuni esempi di lettura e/o codice per favore.
Modifica: Grazie, ho alcuni buoni percorsi da seguire, che richiedono più lettura :) E qui arriva un lungo weekend.
Grazie @ehird, questo mi dà spunti di riflessione. E, sì, penso che limitare il tipo di risultato potrebbe essere sufficiente. La classe Product rappresenta una riga SQL, che è il risultato di una query SQL SELECT, e per le query senza join questo dovrebbe essere sufficiente. Sto provando a lavorare su un mini DSL e la mia speranza iniziale era di raggiungere uno stadio, in cui il risultato di _runSQL_ è una stringa di query accettabile. Quindi qualcosa sulla falsariga di '(Product a) => runSQL :: SQL a -> a'. Lasciare l'esecuzione della query a qualsiasi cosa faccia un back-end db. – dikini
Mi spiace, in quanto sopra la funzione def dovrebbe leggere 'runSQL :: (Product a) => SQL a -> AST a' per alcuni' AST a' – dikini
Le Monade non devono più essere completamente polimorfiche, con [tipi di vincoli ] (http://blog.omega-prime.co.uk/?p=127), vero? Non so se questi sono applicabili al problema dell'OP, però. – leftaroundabout