2013-07-31 13 views
5

Ich habe eine Weile lang versucht, den Code durch Vorlage Haskell in diesem Beispiel aus dem Yesod in Buch erzeugt zu verstehen:Legendes Code generiert durch Yesod Persistent TH

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
Person 
    name String 
    age Int 
    deriving Show 
Car 
    color String 
    make String 
    model String 
    deriving Show 
|] 

Ich fühle mich wie meistens sehe ich, was los ist (vielen Typ Rangier), aber ein Abschnitt verwirrt mich immer noch:

instance PersistEntity (PersonGeneric backend) where 
    data instance Unique (PersonGeneric backend) = 
    data instance EntityField (PersonGeneric backend) typ 
     = typ ~ KeyBackend backend (PersonGeneric backend) => PersonId | 
     typ ~ String => PersonName | 
     typ ~ Int => PersonAge 
    type instance PersistEntityBackend (PersonGeneric backend) = 
     backend 

die Dateninstanz instance EntityField (PersonGeneric backend) typ drei Daten Konstrukteuren hat, der Sinn (einen für jede Spalte in der Datenbank) macht, sondern auch nach oben schauen, was die Tilde tut in Haskell, ich kann nicht unterlegen Und was es dort macht. Warum wird die =>, die normalerweise für die universelle Quantifizierung verwendet wird, nach etwas verwendet, das keine Arten zurückhält?

Bitte lassen Sie mich wissen, wenn ich in irgendeiner Weise klarer sein kann.

Antwort

8

Diese Syntax wird verwendet, um GADT ohne GADT-Syntax zu deklarieren.

Zum Beispiel

data Z a b = (a ~ Int, b ~ Bool) => Z1 a b 
      | (Show a, b ~ Float) => Z2 a b 

entspricht

data Z a b where 
    Z1 :: Int -> Bool -> Z Int Bool 
    Z2 :: Show a => a -> Float -> Z a Float