Haskell:获取字符串形式的数据构造函数名称

rslzwgfq  于 2022-11-30  发布在  其他
关注(0)|答案(3)|浏览(160)

让我们说我们有

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

我希望有一个函数getDConst

getDConst :: D -> String

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

bfnvny8b

bfnvny8b1#

我自己找到了解决办法,但把这个问题留给了别人:

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

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

7bsow1i62#

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

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

Show不会输出所有的字段,因为它是惰性的。你可以在ghci中运行以下代码来测试它:

Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
9njqaruj

9njqaruj3#

我有一个非常基本的答案,它只是一个简单的函数。
假设我有以下数据,数据定义中重复的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"

相关问题