タイプファミリーインスタンスに関する情報
-
26-09-2019 - |
質問
イントロ:
チェックアウト中 スノイマンの「しつこい」 ライブラリ 私は、物事を理解するのに 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
.
所属していません StackOverflow