Haskell:获取数据构造函数名称作为字符串

时间:2013-08-18 08:39:38

标签: haskell reflection ghc generic-programming deriving

让我们说我们有

data D = X Int | Y Int Int | Z String

我希望有一个功能getDConst

getDConst :: D -> String

根据用于输入的数据构造函数返回“X”,“Y”或“Z”。是否有一种通用的方法来编写它而不必在每个数据构造函数上执行case? (我对依赖Data.Typeable或类似的东西的解决方案感到满意)

2 个答案:

答案 0 :(得分:16)

自己找到解决方案,但留下这个问题来帮助别人:

import Data.Data
data D = X Int | Y Int Int deriving (Data,Typeable)

let result = show $ toConstr (X 3) -- result contains what we wanted

答案 1 :(得分:8)

如果您不想使用Typeable,也可以使用Show执行此操作。

getDConst :: D -> String
getDConst = head . words . show

Show不会输出所有字段,因为它是懒惰的。您可以在ghci

中测试它运行此代码
Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"