让我们说我们有
data D = X Int | Y Int Int | Z String
我希望有一个功能getDConst
getDConst :: D -> String
根据用于其输入的数据构造函数返回“X”、“Y”或“Z”。有没有一种通用的方法来编写这个而不必case
对每个数据构造函数都做?(我可以接受依赖Data.Typeable
或类似的解决方案)
让我们说我们有
data D = X Int | Y Int Int | Z String
我希望有一个功能getDConst
getDConst :: D -> String
根据用于其输入的数据构造函数返回“X”、“Y”或“Z”。有没有一种通用的方法来编写这个而不必case
对每个数据构造函数都做?(我可以接受依赖Data.Typeable
或类似的解决方案)
自己找到了解决方案,但留下这个问题来帮助别人:
import Data.Data
data D = X Int | Y Int Int deriving (Data,Typeable)
let result = show $ toConstr (X 3) -- result contains what we wanted
如果您不想使用Typeable
,也可以使用Show
.
getDConst :: D -> String
getDConst = head . words . show
Show
不会输出所有字段,因为它很懒。您可以在以下位置运行此代码对其进行测试ghci
:
Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
我对这个问题有一个非常基本的答案,而无需通过进口或其他任何方式。这只是一个简单的功能。
假设我有以下数据。数据定义中重复的Int是有意的,因为我之后将使用无关符号:
data YES_NO_CANCEL = YES Int | NO Int Int | CANCEL Int Int Int
然后您可以将函数设为:
extractDataType :: YES_NO_CANCEL -> String
extractDataType YES _ = "YES"
extractDataType NO _ _ = "NO".
extractDataType CANCEL _ _ _ = "CANCEL"
.