5

Yesod 本から取ったこの例では、テンプレート haskell によって生成されたコードを理解しようと、しばらく時間を費やしました。

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

私は何が起こっているのか(多くの型のマーシャリング)をほとんど見ているように感じますが、1つのセクションがまだ私を混乱させています:

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には 3 つのデータ コンストラクターがあり、これは理にかなっています (データベースの各列に 1 つ) が、haskell でチルダが何をするかを調べた後でも、そこで何をしているのか理解できません。=>通常は全称量化に使用される が、型を制限していないように見える何かの後に使用されるのはなぜですか?

何らかの方法でより明確にできるかどうか教えてください。

4

1 に答える 1

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
于 2013-07-31T05:41:05.083 に答える