让我们说我们有
data D = X Int | Y Int Int | Z String
我希望有一个函数getDConst
getDConst
getDConst :: D -> String
它根据用于其输入的数据构造函数返回“X”、“Y”或“Z”。有没有一种通用的方法来编写它,而不必对每个数据构造函数都执行case?(我可以使用依赖于Data.Typeable或类似内容的解决方案)
case
Data.Typeable
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
7bsow1i62#
如果不想使用Typeable,也可以使用Show。
Typeable
Show
getDConst :: D -> String getDConst = head . words . show
Show不会输出所有的字段,因为它是惰性的。你可以在ghci中运行以下代码来测试它:
ghci
Prelude> data D = D [Int] deriving (Show) Prelude> getDConst $ D [1..] "D"
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"
3条答案
按热度按时间bfnvny8b1#
我自己找到了解决办法,但把这个问题留给了别人:
7bsow1i62#
如果不想使用
Typeable
,也可以使用Show
。Show
不会输出所有的字段,因为它是惰性的。你可以在ghci
中运行以下代码来测试它:9njqaruj3#
我有一个非常基本的答案,它只是一个简单的函数。
假设我有以下数据,数据定义中重复的Int是有意的,因为我将在后面使用无关符号:
那么你可以创建一个函数: