21

让我们说我们有

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

我希望有一个功能getDConst

getDConst :: D -> String

根据用于其输入的数据构造函数返回“X”、“Y”或“Z”。有没有一种通用的方法来编写这个而不必case对每个数据构造函数都做?(我可以接受依赖Data.Typeable或类似的解决方案)

4

3 回答 3

23

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

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

let result = show $ toConstr (X 3) -- result contains what we wanted
于 2013-08-18T08:50:34.193 回答
10

如果您不想使用Typeable,也可以使用Show.

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

Show不会输出所有字段,因为它很懒。您可以在以下位置运行此代码对其进行测试ghci

Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
于 2013-08-18T09:06:40.263 回答
0

我对这个问题有一个非常基本的答案,而无需通过进口或其他任何方式。这只是一个简单的功能。

假设我有以下数据。数据定义中重复的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"

.

于 2021-11-19T11:48:18.417 回答