次のように実行できます。
import Data.Typeable
getStaticType :: Typeable a => a -> String
getStaticType = show . typeOf
タイプは のインスタンスでなければならないことに注意してくださいTypeable
。Haskell言語拡張機能Typeable
と.DeriveDataTypeable
... deriving (Typeable, ...)
また、ポリモーフィック型はこの方法では識別できないことに注意してください。常に特定の型で関数を呼び出さなければならないため、コンパイルされた Haskell コードを使用して GHCi で取得する多相型情報を取得することはできません。
GHCi が行う方法は、GHC API を使用して、型情報を含む中間 Haskell 抽象構文木 (AST) を分析することです。GHCi には、通常のコンパイルされた Haskell プログラムと同じような制限された環境はありません。その環境に関するより多くの情報を見つけるために、多くのことを行うことができます。
TemplateHaskell を使用すると、次のようにできます。まず、このモジュールを作成します。
module TypeOf where
import Control.Monad
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
getStaticType :: Name -> Q Exp
getStaticType = lift <=< fmap pprint . reify
次に、別のモジュール(非常に重要) で、次のことができます。
{-# LANGUAGE TemplateHaskell #-}
import TypeOf
main = putStrLn $(getStaticType 'zipWith)
このプログラムは次を出力します。
GHC.List.zipWith :: forall a_0 b_1 c_2 . (a_0 -> b_1 -> c_2) ->
[a_0] -> [b_1] -> [c_2]
pprint
関数よりも優れたプリティプリンターを使用できます。Language.Haskell.TH.Ppr
モジュールを見てください。