Информация о случаях семейного типа
Вступление:
Проверяя "постоянную"библиотеку сноймана , я обнаружил, что мне нужна помощь 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)
Экземпляр всегда можно найти в исходном коде, но иногда его бывает трудно найти, и он может быть скрыт в шаблоне-сгенерированном хаскеллом коде и т. д.
Код пример:
{-# 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 или любого другого инструмента?
1 ответ:
Показывает ли вам
-ddump-splices
сгенерированный TH-код в этом случае?В противном случае,
:browse
дает вам информацию об экземплярах семейства данных, но не о семействах типов.Вы можете подать билет ghc - выходные данные
:browse
выглядят искаженными, и можно ожидать, что экземпляры семейства данных будут сообщаться как экземпляры класса:info
.