我实际上并不认为术语“#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)
现在,我可以在每个值构造函数的名称中添加一个前缀,其中PropLogic
和PropQuantifiedLogic
都有冲突的名称,但重点是我要创建许多类似这样的类型有很多冲突的值构造函数:模态逻辑类型,时态逻辑类型等...并为每一个创建新的前缀很快就会变得难看。
我真正想要的是:
extendtype PropQuantifiedLogic a = PropLogic a | Exists (PropQuantifiedLogic a)
| Forall (PropQuantifiedLogic a)
这将等同于PropQuantifiedLogic
的第一个定义,并将进行类型检查。
在Haskell中可以做这样的事吗?如果没有,我该如何处理这种情况?这个"扩展类型"概念会引入一些含糊之处,但我认为只是意味着类型推断在使用这样的类型时不会起作用,我可以处理它。
答案 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)