了解Yesod Persistent TH生成的代码

时间:2013-07-31 03:25:07

标签: haskell yesod persistent

我花了一些时间试图理解模板haskell生成的代码,在这个例子中取自Yesod书:

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中的作用之后,我也无法理解它在那里做了什么。为什么通常用于通用量化的=>用于似乎不会重写任何类型的东西?

如果我能以某种方式更清楚,请告诉我。

1 个答案:

答案 0 :(得分: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