是否有"类型扩展"在哈斯克尔?

时间:2014-08-06 01:37:20

标签: haskell algebraic-data-types

我实际上并不认为术语“#34;类型扩展”"正式意味着我想要的东西,但它是我能想到的唯一一个词。

我有一个多态Haskell类型来表示命题逻辑中的术语:

 data PropLogic a = Prop a | Tautology | Contradiction | And (PropLogic a) (PropLogic a)
                | Or (PropLogic a) (PropLogic a) | Implies (PropLogic a) (PropLogic a)
                | Not (PropLogic a)
     deriving (Eq,Show)

问题是,我还想要一个与量化算子类似的多态类型用于命题逻辑:

data PropQuantifiedLogic a = Prop a | Tautology | Contradiction | And (PropQuantifiedLogic a) (PropQuantifiedLogic a)
                | Or (PropQuantifiedLogic a) (PropQuantifiedLogic a) | Implies (PropQuantifiedLogic a) (PropQuantifiedLogic a)
                | Not (PropQuantifiedLogic a) | Forall (PropQuantifiedLogic a)
                | Exists (PropQuantifiedLogic a)
     deriving (Eq,Show)

现在,我可以在每个值构造函数的名称中添加一个前缀,其中PropLogicPropQuantifiedLogic都有冲突的名称,但重点是我要创建许多类似这样的类型有很多冲突的值构造函数:模态逻辑类型,时态逻辑类型等...并为每一个创建新的前缀很快就会变得难看。

我真正想要的是:

extendtype PropQuantifiedLogic a = PropLogic a | Exists (PropQuantifiedLogic a)
                                 | Forall (PropQuantifiedLogic a)

这将等同于PropQuantifiedLogic的第一个定义,并将进行类型检查。

在Haskell中可以做这样的事吗?如果没有,我该如何处理这种情况?这个"扩展类型"概念会引入一些含糊之处,但我认为只是意味着类型推断在使用这样的类型时不会起作用,我可以处理它。

2 个答案:

答案 0 :(得分:7)

您可以随时将其实现为

 data PropFrame a b = OrF b b | AndF b b ... | Prop a | Top

然后

type Prop a = Fix (PropFrame a)

然后你可以添加一个新的原语

data QualifiedF a b = All (b -> b) | Exists (b -> b) | LiftProp (PropFrame a b)
type Qualified a = Fix (QualifiedF a)

这是一个更小的丑陋,但可以用-XPatternSynonyms加油。这里的主要思想是将有问题的递归情况分解为显式参数,并使用Fix重新获得递归。

使用示例

qand :: Qualified a -> Qualified a -> Qualified a
qand l r = Fix (LiftProp (AndF l r))

orOrAll :: (Qualified a -> Qualified a) -> Qualified a
orOrAll f = Fix (All f) `qand` Fix (Exists f)

答案 1 :(得分:1)

您可以使用PropLogic a并添加其他构造函数QuantifiedLogic

data PropQuantifiedLogic a =  QuantifiedLogic (PropLogic a)
                            | Exists (PropQuantifiedLogic a)
                            | Forall (PropQuantifiedLogic a)
相关问题