【发布时间】:2012-04-11 19:36:56
【问题描述】:
在我的项目中,我创建了一种数据类型,它可以保存以下几种类型的值之一:
data PhpValue = VoidValue | IntValue Integer | BoolValue Bool
我现在想做的是有一种简单的方法来检查 PhpValue 类型的两个值是否属于同一个构造函数(如果我对这里的术语感到困惑,请纠正我,但基本上我想要的例如,检查两者是否都是IntValue,而不关心特定值)。
这是我为此编写的一个函数:
sameConstructor :: PhpValue -> PhpValue -> Bool
sameConstructor VoidValue VoidValue = True
sameConstructor (IntValue _) (IntValue _) = True
sameConstructor (BoolValue _) (BoolValue _) = True
sameConstructor _ _ = False
这可以正常工作,但我不太喜欢它:如果我添加更多构造函数(如FloatValue Float),我将不得不重写函数,并且随着我的数据定义变得更大,它会变得更大.
问题:有没有办法编写这样的函数,这样当我添加更多构造函数时它的实现不会改变?
郑重声明:我不想更改data 的定义,我的其余代码中有足够的Monads ;)
【问题讨论】:
-
你应该用
_替换你从不使用的参数。所以sameConstructor sth els = False最好写成sameCOnstructor _ _ = False等等。这使您不会使用这些值的事实更加清楚。 -
您也可以将
(IntValue a)和其他人替换为(IntValue _)。
标签: haskell