Информация о семейных экземплярах типа
-
26-09-2019 - |
Вопрос
Вступление:
При проверке «настойчивый» соймана Библиотека я обнаружил, что желаю поддержки GHCI (или другого инструмента) в выяснении материала.
Ghci's. :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 Code и т. Д.
Пример кода:
{-# 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
|]
То, что происходит в примере кода выше, это то, что шаблон-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 или любой другой инструмент?
Решение
Делает -ddump-splices
Покажите вам Th-Genered код в этом случае?
Иначе, :browse
Дает вам информацию о семейных экземплярах данных, хотя и не о типах семейств.
Вы можете подать ГК ГК - то :browse
Вывод внешний вид Mangled, и можно ожидать, что данные семейства данных будут сообщены как экземпляры классов, :info
.