2016-04-03 9 views
0

Ich habe viele "Daten", die SQL-Tabelle in einer Datenbank darstellen.Wie einfach alle "Daten" -Definitionen die gleiche Art und den gleichen Namen eines Feldes haben?

data User = User { userId :: Int, userName :: String } 
    data Article = Article { articleId :: Int, articleTitle :: String, articleBody :: String } 
-- ....... 

Alle von ihnen hat das Feld "ID" als Primärschlüssel. Ich frage mich, gibt es einen Weg, die Notwendigkeit zu beseitigen, es jedes Mal für jede "Daten" zu definieren, kann ich das irgendwie vereinfachen? Wenn dies geschieht:

class DataTable a where 
    myId :: Int 

wird es nichts ändern, wird? Ich muss immer noch "ID" für jede Daten definieren und dann für DataTable implementieren, in der Tat wird es komplexer.

Antwort

3

Manchmal ist es am besten, Dinge zu trennen.

data Identified a = Identified 
    { ident :: !Int 
    , payload :: a } 

Jetzt können Sie identifizierte Dinge auf eine völlig einheitliche Weise behandeln.

+0

Wie kann ich es auf meinen Fall anwenden? –

2

In GHC 8.0 mit DuplicateRecordFields können Sie denselben Datensatzfeldnamen für viele Datentypen verwenden. Dies ist Teil des größeren Features von OverloadedRecordFields.

Teil 3, MagicClasses, führt ableitbare Klassen für HasField und UpdateField ein. Dies ist in der Idee zu Ihrer DataTable ähnlich.

Wenn Sie ein Feld in Ihrem Datentyp möchten, müssen Sie es in der Datentypdefinition deklarieren. Mir sind keine Erweiterungen bekannt, außer Template Haskell, die das ändern.

+0

Ich denke, 'DuplicateRecordFields' löst ein anderes Problem als der Benutzer fragt. (Obwohl ich froh bin darüber zu erfahren!) – chepner

Verwandte Themen