2013-07-31 30 views
5

ho trascorso un po 'cercando di capire il codice generato dal modello di Haskell in questo esempio tratto dal libro Yesod:codice intesa generato da Yesod TH persistente

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

Mi sento come se per lo più a vedere cosa sta succedendo (un sacco di tipo di smistamento), ma una sezione mi confonde ancora:

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 

l'istanza di dati instance EntityField (PersonGeneric backend) typ ha tre costruttori di dati, che ha senso (uno per ogni colonna nel database), ma anche dopo aver guardato a ciò la tilde lo fa in haskell, non posso sottotitoli tand cosa sta facendo lì. Perché lo =>, normalmente utilizzato per la quantificazione universale, viene utilizzato dopo qualcosa che non sembra restringere alcun tipo?

Per favore fatemi sapere se posso essere più chiaro in qualche modo.

risposta

8

Questa sintassi viene utilizzata per dichiarare GADT senza sintassi GADT.

Ad esempio,

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

è equivalente a

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