约束数据类型

Holdwin

假设您有一个很好的归纳定义,并且想将其定义为Haskell中的数据类型。但是,归纳定义的形式(与许多归纳定义一样)使得生成规则要求其“前提”具有某种结构。例如,假设我们有以下定义:

  • 如果x是偶数,那么T x是武器,
  • 如果x是奇数整数,则S x是武器。

如果我想在Haskell中定义此(作为单个)数据类型,我会写类似

data Weapon =  T Int | S Int

显然,这将无法工作,例如您现在可以生成T 5S 4是否有一种自然的方式来传递对构造函数参数的限制,以便我可以编写类似于上述代码的内容,从而给出正确的定义?

鞋子

最好的方法不是导出TS显式,而是允许自定义构造函数:

module YourModule (Weapon, smartConstruct) where

data Weapon =  T Int | S Int

smartConstruct :: Int -> Weapon
smartConstruct x
    | even x     = T x
    | otherwise  = S x

现在,在导入时YourModule,用户将无法创建TS显式,而只能使用您的smartConstruct功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章