GHC API でモジュールが export している名前とその型を得る

./BrowseType Prelude のように使うと

(snip)
break = forall a. (a -> GHC.Bool.Bool) -> [a] -> ([a], [a])
catch = forall a. GHC.Types.IO a -> (GHC.IO.Exception.IOError -> GHC.Types.IO a) -> GHC.Types.IO a
ceiling = forall a. (GHC.Real.RealFrac a) => forall b. (GHC.Real.Integral b) => a -> b
compare = forall a. (GHC.Classes.Ord a) => a -> a -> GHC.Ordering.Ordering
concat = forall a. [[a]] -> [a]
concatMap = forall a b. (a -> [b]) -> [a] -> [b]
const = forall a b. a -> b -> a
cos = forall a. (GHC.Float.Floating a) => a -> a
cosh = forall a. (GHC.Float.Floating a) => a -> a
curry = forall a b c. ((a, b) -> c) -> a -> b -> c
cycle = forall a. [a] -> [a]
decodeFloat = forall a. (GHC.Float.RealFloat a) => a -> (GHC.Integer.Type.Integer, GHC.Types.Int)
(snip)

のように表示される.


以下 GHC API に関してメモ.
名前とその型は TyThing によって関連付けられている.
AnId が変数名 (型は Id になっているが,これは Var のエイリアス),ADataCon が data constructor,ATyCon が type constructor,AClass がクラス.
Var も DataCon も NamedThing なので getOccString で String にできる.
Var と DataCon はそれぞれ varType, dataConType で Type に変換することができ,Type は Outputable なので ppr で SDoc にできる.
なぜか showSDocOneLine の定義で PageMode が指定されていて全然 OneLine じゃないので,上のコード中では自分で OneLineMode を指定して String にしている.


TyThing を得るために最初は modInfoTyThings を使っていたが,これだとそのモジュールが export しているもの全てはとってこれないので,まず modInfoExports で export されている名前を得てからそれぞれに対して lookupName で TyThing を得る必要がある (たぶん).