你可以这样做:
import Data.Typeable
getStaticType :: Typeable a => a -> String
getStaticType = show . typeOf
请注意,该类型必须是一个实例Typeable
。你可以推导出Typeable
自动使用DeriveDataTypeable
Haskell 语言扩展和... deriving (Typeable, ...)
.
另请注意,多态类型不能以这种方式识别;您必须始终使用specific类型,因此您永远无法获得使用编译的 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 module.