Информация о типах семейных экземпляров - PullRequest
4 голосов
/ 10 июня 2010

Введение

При проверке библиотеки snoyman "persistent" я обнаружил, что мне нужна помощь 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)

Всегда можно найти экземпляр в исходном коде, но иногда его может быть трудно найти, и он может быть скрыт в сгенерированном шаблоном хакелом коде и т. Д.

Пример кода:

{-# 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 Ответ

5 голосов
/ 10 июня 2010

Показывает ли -ddump-splices код, сгенерированный TH в этом случае?

В противном случае :browse дает вам информацию об экземплярах семейства данных, но не о семействах типов.

Возможно, вы захотите подать ghc ticket - вывод :browse выглядит искаженным, и можно ожидать, что экземпляры семейства данных будут сообщаться как экземпляры классов, :info.

...