2010-06-10 2 views
4

Введение:Информация о семейных случаях типа

Во время проверки из 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 или любой другой инструмент?

ответ

5

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

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

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

+0

@claus: 10x. ': browse' это потрясающе! '-ddump-splices' показывает код, генерируемый TH. Также получается, что он показывает это лучше, чем 'pprint' делает (' 'boo' 'vs' ['b', \ n'o ', \ n'o' \ n] 'и т. Д.), Думал' runQ/pprint' выход не просто сбрасывается, поэтому я могу его фильтровать и т. д. – yairchu

Смежные вопросы