2013-07-31 29 views
5

Tôi đã trải qua một thời gian cố gắng tìm hiểu mã được tạo ra bởi mẫu Haskell trong ví dụ này lấy từ cuốn sách Yesod:Hiểu mã được tạo bởi Yesod TH dai dẳng

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

Tôi cảm thấy như tôi chủ yếu là xem những gì đang xảy ra (rất nhiều loại marshalling), nhưng một phần vẫn còn bối rối cho tôi:

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 

Thể hiện dữ liệu instance EntityField (PersonGeneric backend) typ có ba nhà xây dựng dữ liệu, có ý nghĩa (một cho mỗi cột trong cơ sở dữ liệu), nhưng ngay cả sau khi nhìn lên những gì dấu ngã trong haskell, tôi không thể gạch dưới và những gì nó đang làm ở đó. Tại sao là =>, thường được sử dụng để định lượng phổ quát, được sử dụng sau khi một cái gì đó mà không có vẻ để phục hồi bất kỳ loại?

Vui lòng cho tôi biết nếu tôi có thể rõ ràng hơn theo một cách nào đó.

Trả lời

8

Cú pháp này được sử dụng để khai báo GADT mà không có cú pháp GADT.

Ví dụ,

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

tương đương với

data Z a b where 
    Z1 :: Int -> Bool -> Z Int Bool 
    Z2 :: Show a => a -> Float -> Z a Float 
Các vấn đề liên quan