2013-07-31 22 views
5

Ben Yesod'dan kitaptan alınan bu örnekte şablon Haskell tarafından oluşturulan kodu anlamaya çalışan bir süre geçirdik (bir tür sıralanırken sürü), ama bir bölüm hala beni karıştırır:anlama kod

veri örneği instance EntityField (PersonGeneric backend) typ (veritabanında her sütun için bir tane) mantıklı üç veri kurucular vardır
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 

, ancak bu bile ararken sonra neler Tilde haskell içinde, ben anlayamıyorum Orada ne yapıyorsun. Normal olarak evrensel niceleme için kullanılan => neden her türünü kısıtlamayan bir şeyden sonra kullanılır?

Lütfen bir şekilde daha açık olabileceğimi söyleyin.

cevap

8

Bu sözdizimi, GADT sözdizimi olmadan GADT'yi bildirmek için kullanılır. Örneğin

,

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 
eşdeğerdir