2013-07-31 30 views
5

spędziłem starając się zrozumieć kod generowany przez szablon Haskell w tym przykładzie zaczerpnięte z książki Yesod:Zrozumienie kod generowany przez Yesod Trwałych TH

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

czuję się jak najczęściej zobaczyć, co się dzieje (dużo typu zestawiania), ale jedna sekcja wciąż mnie dezorientuje:

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 

instancja danych instance EntityField (PersonGeneric backend) typ ma trzy konstruktorów danych, co ma sens (po jednym dla każdej kolumny w bazie danych), ale nawet po patrząc na to, co tylda ma w haskell, nie mogę tego podkreślić tand, co on tam robi. Dlaczego =>, zwykle używane do uniwersalnej kwantyfikacji, jest używane po czymś, co wydaje się nie mieć żadnego charakteru?

Proszę dać mi znać, jeśli mogę być w jakiś sposób bardziej przejrzysty.

Odpowiedz

8

Ta składnia służy do deklarowania GADT bez składni GADT.

Przykładowo

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

odpowiada

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