質問

イントロ:

チェックアウト中 スノイマンの「しつこい」 ライブラリ 私は、物事を理解するのに 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 またはその他のツールを使用して、タイプ ファミリとデータ ファミリのインスタンスに関する情報を取得する簡単な方法はありますか?

役に立ちましたか?

解決

する -ddump-splices この場合、TH が生成したコードを見せてください。

さもないと、 :browse データ ファミリ インスタンスに関する情報は提供されますが、タイプ ファミリについては提供されません。

ファイルを提出するとよいでしょう GHCチケット - :browse 出力は壊れているように見え、データ ファミリ インスタンスがクラス インスタンスと同様にレポートされることが期待されるかもしれません。 :info.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top