Stavo cercando di codificare un problema relazionale in Haskell, quando ho dovuto scoprire che fare questo in un modo sicuro è tutt'altro che ovvio. Per esempio. un umilePerché le operazioni relazionali per la sicurezza dei caratteri sono così difficili?
select 1,a,b, from T
solleva già una serie di domande:
- qual è il tipo di questa funzione?
- qual è il tipo di proiezione
1,a,b
? Qual è il tipo di a proiezione in generale? - qual è il tipo di risultato e come posso esprimere la relazione tra il tipo di risultato e la proiezione?
- qual è il tipo di tale funzione che accetta qualsiasi proiezione valida?
- come è possibile rilevare le proiezioni non valide al momento della compilazione?
- Come aggiungere una colonna a un tavolo oa una proiezione?
Credo che persino il linguaggio PL/SQL di Oracle non lo giustamente. Mentre le proiezioni invald vengono per lo più rilevate in fase di compilazione, si tratta di un numero elevato di errori di tipo che vengono visualizzati solo in fase di esecuzione. La maggior parte degli altri binding a RDBMS (ad esempio jdbc di Java e DBI di perl) utilizzano SQL contenuto in String e quindi rinuncia completamente alla sicurezza del tipo.
Ulteriori ricerche hanno dimostrato che ci sono alcune librerie Haskell (HList, vinyl e TRex), che forniscono type-safe record estensibili e un po 'di più. Ma tutte queste librerie richiedono estensioni Haskell come DataKinds, FlexibleContexts e molte altre ancora. Inoltre queste librerie non sono facili da usare e hanno un odore di inganno, almeno per osservatori non inizializzati come me.
Ciò suggerisce che le operazioni relazionali basate sul tipo non si adattano bene al paradigma funzionale, almeno non come è implementato in Haskell.
Le mie domande sono le seguenti:
- Quali sono le cause fondamentali di questa difficoltà per modellare le operazioni relazionali in un tipo modo sicuro. Dove finisce Hindley-Milner? O il problema si origina già al calcolo lambda tipizzato?
- Esiste un paradigma, in cui le operazioni relazionali sono cittadini di prima classe? E se è così, c'è un'implementazione nel mondo reale?
Hai esaminato le librerie che consentono l'accesso al DB di tipo sicuro in Haskell? Per esempio. https://hackage.haskell.org/package/esqueleto o http://www.yesodweb.com/book/persistent? – chi
Non ancora. L'accesso al database non è la mia preoccupazione principale. Ma quei pacchetti devono aver risolto i miei problemi in un modo o nell'altro, quindi potrei dare un'occhiata. Grazie. –