让我们说我们有
data D = X Int | Y Int Int | Z String
我希望有一个功能getDConst
getDConst :: D -> String
根据用于输入的数据构造函数返回“X”,“Y”或“Z”。是否有一种通用的方法来编写它而不必在每个数据构造函数上执行case
? (我对依赖Data.Typeable
或类似的东西的解决方案感到满意)
答案 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"