鉴于某些数据类型的两个术语t1 t2,是否有某种方法可以检查t1和t2是否以相同的构造函数开头,而没有在构造函数上做一些详尽的情况或模式匹配?就像我的类型是一个b,然后我想要
checkConst (Left x) (Left y) = True
checkConst (Right x) (Left y) = False
...
等等,实际上没有进行模式匹配,并且可以推广到其他类型的10个构造函数。有没有一个很好的方法来做到这一点?
答案 0 :(得分:6)
您可能正在寻找Data.Data
模块中提供的泛型功能。如果您使用派生的Data
实例定义数据类型,请执行以下操作:
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
data Foo = Bar1 Int
| Bar2 String String
| Bar3 Double
deriving (Data)
然后您可以使用toConstr
检索值的构造函数:
> toConstr (Bar1 1)
Bar1
> toConstr (Bar2 "hello" "there")
Bar2
>
这些类型为Constr
的值可以进行相等性比较,因此您可以定义:
checkConst :: (Data g) => g -> g -> Bool
checkConst x y = toConstr x == toConstr y
并获得:
> checkConst (Bar1 10) (Bar1 20)
True
> checkConst (Bar1 10) (Bar3 20)
False
>
答案 1 :(得分:3)