Введение:Информация о семейных случаях типа
Во время проверки из snoyman's "persistent" библиотеки я обнаружил, желающих GHCI (или другой инструмент) помощь в выяснении вещи.
GHCi игровая :info
, кажется, не работают, как хорошо с типовыми семьями и данными-семьями, как это происходит с «простыми» типами:
> :info Maybe
data Maybe a = Nothing | Just a -- Defined in Data.Maybe
...
> :info Persist.Key Potato -- "Key Potato" defined in example below
data family Persist.Key val -- Defined in Database.Persist
... (no info on the structure/identity of the actual instance)
всегда можно искать, например, в исходном коде, но иногда это может быть трудно найти, и он может быть скрыт в шаблон-Haskell сгенерированный код и т.д.
пример кода:
{-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving, MultiParamTypeClasses, TypeFamilies, QuasiQuotes #-}
import qualified Database.Persist as Persist
import Database.Persist.Sqlite as PSqlite
PSqlite.persistSqlite [$persist|
Potato
name String
isTasty Bool
luckyNumber Int
UniqueId name
|]
Что происходит в приведенный выше пример, что Template-Haskell генерирует код для нас здесь. Все расширения, за исключением QuasiQuotes
, требуются, потому что сгенерированный код использует их.
я узнал, что Persist.Key Potato
это делать:
-- test.hs:
test = PSqlite.persistSqlite [$persist|
...
-- ghci:
> :l test.hs
> import Language.Haskell.TH
> import Data.List
> runQ test >>= putStrLn . unlines . filter (isInfixOf "Key Potato") . lines . pprint
where newtype Database.Persist.Key Potato = PotatoId Int64
type PotatoId = Database.Persist.Key Potato
Вопрос:
Есть более простой способ, чтобы получить информацию о случаях семей типа и семей данных, используя GHCI или любой другой инструмент?
@claus: 10x. ': browse' это потрясающе! '-ddump-splices' показывает код, генерируемый TH. Также получается, что он показывает это лучше, чем 'pprint' делает (' 'boo' 'vs' ['b', \ n'o ', \ n'o' \ n] 'и т. Д.), Думал' runQ/pprint' выход не просто сбрасывается, поэтому я могу его фильтровать и т. д. – yairchu