men*_*ics 8 haskell introspection
假设我在模块My.Module中定义了MyType类型.我想要字符串"My.Module.MyType"(或类似的东西).如果我只是直接输入字符串,我可能会输入错误,如果模块或类型名称发生变化,我想在编译时知道.
啊,似乎可能会对我的要求感到困惑.请仔细看看这个问题.鉴于代码:
module My.Module
type MyType = Int
data MyType2 = MyConstructor2 Int
main = do
putStrLn $ theMagic MyType
putStrLn $ theMagic MyType2
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
My.Module.MyType
My.Module.MyType2
Run Code Online (Sandbox Code Playgroud)
我正在寻找类型名称,而不是类型定义.typeOf会输出Int等等,这不是我想要的.
scl*_*clv 10
总之,答案是启用模板haskell并使用'和''
{-# LANGUAGE TemplateHaskell #-}
main = do
putStrLn $ show 'read
Run Code Online (Sandbox Code Playgroud)
如果你的类型派生的Typeable(这GHC可以自动完成),那么你可以只调用typeOf从Data.Typeable获得showable表示.
如果你想获得某些多态函数的类型,Hackage上的polytypeable包允许你这样做:http://hackage.haskell.org/packages/archive/polytypeable/0.1.0.0/doc/html/Data-PolyTypeable . HTML
这是一种疯狂的类型级别的东西,由Oleg编写并由Lennart打包,请注意.它有......怪癖.最明显的是它无法给你(我也无法想象任何事情可以坦率地说)类约束上下文.所以show会给出一种a -> String而不是forall a. Show a => a -> String.
如果你需要更多,并且只对编译时做某些事情感到满意,那么使用模板haskell直接从ghc中提取类型信息是唯一的方法.见reify和Info特别:http://hackage.haskell.org/packages/archive/template-haskell/2.5.0.0/doc/html/Language-Haskell-TH.html
| 归档时间: |
|
| 查看次数: |
1673 次 |
| 最近记录: |