Вопрос

Вступление:

При проверке «настойчивый» соймана Библиотека я обнаружил, что желаю поддержки 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top