2013-07-31 107 views
5

我花了一段時間試圖瞭解在這個例子從耶索德書採取模板哈斯克爾生成的代碼:理解代碼

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

我覺得我主要是看看這是怎麼回事(很多類型編組),但有部分還是混淆了我:

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 

數據實例instance EntityField (PersonGeneric backend) typ有三個數據構造,這是有道理的(每列在數據庫中),但細算起來,即使什麼在haskell中代字號的確是有用的,我無法理解在那裏做什麼。爲什麼=>通常用於通用量化,在似乎沒有任何類型的東西之後使用?

請讓我知道,如果我能以某種方式更清晰。

回答

8

該語法用於聲明沒有GADT語法的GADT。

例如,

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

相當於

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