gpt4 book ai didi

haskell - 如何在 Haskell 中将类型作为字符串获取?

转载 作者:行者123 更新时间:2023-12-04 06:26:57 25 4
gpt4 key购买 nike

假设我在模块 My.Module 中定义了一个类型 MyType。我想要字符串“My.Module.MyType”(或类似的东西)。如果我只是直接输入字符串,我可能会打错字,如果模块或类型名称发生变化,我想在编译时知道。

啊,我的问题似乎有些困惑。请仔细看问题。给定代码:

module My.Module
type MyType = Int
data MyType2 = MyConstructor2 Int
main = do
putStrLn $ theMagic MyType
putStrLn $ theMagic MyType2

我想要的输出是:
My.Module.MyType
My.Module.MyType2

我正在寻找类型名称,而不是类型定义。 typeOf 会输出 Int 等,这不是我想要的。

最佳答案

总之,答案是启用模板haskell并使用'''

{-# LANGUAGE TemplateHaskell #-}
main = do
putStrLn $ show 'read

如果您的类型派生 Typeable (这 ghc 可以自动执行)然后您可以调用 typeOf来自 Data.Typeable得到一个可显示的表示。
如果你想获得某些多态函数的类型,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 中提取类型信息是唯一的方法。见 reifyInfo特别是: http://hackage.haskell.org/packages/archive/template-haskell/2.5.0.0/doc/html/Language-Haskell-TH.html

关于haskell - 如何在 Haskell 中将类型作为字符串获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5354431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com