Ich habe versucht, ein relationales Problem in Haskell zu programmieren, als ich herausfinden musste, dass dies in einer Art sicheren Art und Weise zu tun ist, ist alles andere als offensichtlich. Z.B. ein bescheidenesWarum sind typsichere relationale Operationen so schwierig?
select 1,a,b, from T
wirft bereits eine Reihe von Fragen:
- was ist die Art dieser Funktion?
- Was ist der Typ der Projektion
1,a,b
? Was ist der Typ von eine Projektion im Allgemeinen? - Was ist der Ergebnistyp und wie drücke ich die Beziehung zwischen dem Ergebnistyp und der Projektion aus?
- Was ist der Typ einer solchen Funktion, die eine gültige Projektion akzeptiert?
- Wie kann ich beim Kompilieren ungültige Projektionen erkennen?
- Wie würde ich eine Spalte zu einer Tabelle oder zu einer Projektion hinzufügen?
Ich glaube, sogar Oracle PL/SQL-Sprache wird nicht ganz richtig. Während Ungültige Projektionen meist zur Kompilierzeit erkannt werden, gibt es eine große Anzahl von Typfehlern, die nur zur Laufzeit angezeigt werden. Die meisten anderen Bindungen zu RDBMS (z. B. Java's jdbc und Perls DBI) verwenden SQL, das in Strings enthalten ist, und geben somit die Typensicherheit vollständig auf.
Weitere Untersuchungen zeigten, dass es einige Haskell-Bibliotheken (HList, vinyl und TREX), die und etwas mehr typsichere erweiterbare Aufzeichnungen zur Verfügung stellen. Aber diese Bibliotheken benötigen alle Haskell-Erweiterungen wie DataKinds, FlexibleContexts und viele mehr. Außerdem sind diese Bibliotheken nicht einfach zu bedienen und riechen nach Tricks, zumindest für nicht initialisierte Beobachter wie mich.
Dies deutet darauf hin, dass typsichere relationale Operationen nicht gut in das funktionale Paradigma passen, zumindest nicht so, wie es in Haskell implementiert ist.
Meine Fragen sind:
- Was die grundlegenden Ursachen für diese Schwierigkeiten sind relationale Operationen in einer Art sichere Art und Weise zu modellieren. Wo steht Hindley-Milner? Oder liegt das Problem bereits am typisierten Lambda-Kalkül?
- Gibt es ein Paradigma, in dem relationale Operationen erstklassige Bürger sind? Und wenn ja, gibt es eine Implementierung in der realen Welt?
Haben Sie sich die Bibliotheken angeschaut, die einen typsicheren DB-Zugriff in Haskell erlauben? Z.B. https://hackage.haskell.org/package/esqueleto oder http://www.yesodweb.com/book/persistent? – chi
Noch nicht. Der Datenbankzugriff ist nicht meine Hauptsorge. Aber diese Pakete müssen meine Probleme auf die eine oder andere Weise gelöst haben, also könnte ich einen Blick darauf werfen. Vielen Dank. –