假设您有一个很好的归纳定义,并且想将其定义为Haskell中的数据类型。但是,归纳定义的形式(与许多归纳定义一样)使得生成规则要求其“前提”具有某种结构。例如,假设我们有以下定义:
x
是偶数,那么T x
是武器,x
是奇数整数,则S x
是武器。如果我想在Haskell中定义此(作为单个)数据类型,我会写类似
data Weapon = T Int | S Int
显然,这将无法工作,例如您现在可以生成T 5
和S 4
。是否有一种自然的方式来传递对构造函数参数的限制,以便我可以编写类似于上述代码的内容,从而给出正确的定义?
最好的方法不是导出T
和S
显式,而是允许自定义构造函数:
module YourModule (Weapon, smartConstruct) where
data Weapon = T Int | S Int
smartConstruct :: Int -> Weapon
smartConstruct x
| even x = T x
| otherwise = S x
现在,在导入时YourModule
,用户将无法创建T
和S
显式,而只能使用您的smartConstruct
功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句