在构造数据类型时选择类型类

时间:2015-01-31 23:14:00

标签: dependent-type idris

我在idris中有一个数据类型:

data L3 = Rejected | Unproven | Proven

我确认这是一个团结,格子,团体和其他一些属性的戒指。

现在我想创建一个对象,它保留了我在其中注入的语句的表达式。我从四个类别开始代表所有操作,因此我从中获得了一个很好的语法树。例如:

Om [Proven, Unproven, Op [Proven, Oj [Unproven, Proven]] 

这不是真正的表现形式,我剥夺了一些所需的丑陋部分,但它给出了我想要实现的目标,上面相当于:

meet Proven (meet Unproven (Proven <+> (join Unproven Proven)))

我认识到我可以将数据类型合并为一个。为了实现这一目标,我创建了一个函数,它将选择正确的类实例:

%case data Operator = Join | Meet | Plus | Mult

classChoice : (x: Operator) -> (Type -> Type)
classChoice Join = VerifiedJoinSemilattice
classChoice Meet = VerifiedMeetSemilattice
classChoice Plus = VerifiedGroup
classChoice Mult = VerifiedRing

所以我可以保证类型中的任何东西代表这四种操作中的一种:

 %elim data LogicSyntacticalCategory : classChoice op a => (op : Operator) -> (a : Type) -> Type where
       LSCEmpty : LogicSyntacticalCategory op a

它会抱怨:

When elaborating type of logicCategory.LSCEmpty:
Can't resolve type class classChoice op ty

现在我的问题:如何确保我的数据类型中的对象得到验证,并将四种不同的数据类型合并为一种。我真的很想确保在施工期间这是真的。我可以理解它现在很难解决类型类,但我希望Idris确保它可以在以后的构建过程中完成。我怎样才能做到这一点?

代码并不是真的需要,我对思想方向很满意。

1 个答案:

答案 0 :(得分:2)

首先出现两个小问题:... -> a -> ...应该是... -> (a : Type) -> ...,语法就是它的写法。

警告:我正在使用Idris 0.9.18并且还不知道如何编写Elab样张。

存储库:https://github.com/runKleisli/idris-classdata

在具有相同类型签名的普通函数中,您可以在定义函数时协助类型类解析和策略。但是对于数据类型及其构造函数,您只有机会声明它们,因此您没有机会协助解决问题。这似乎需要这样的指导性解决方案。

似乎classChoice op a需要在LogicSyntacticleCategory op a的定义中的LSCEmpty之前证明的实例,并且它没有得到此实例。像这样的数据类型类型中的类约束通常会自动引入到构造函数的上下文中,就像隐式参数一样,但这似乎在这里失败了,并假设一个实例的类型与所需的类型不同。该实例假设构造函数不满足通过声明LogicSyntacticleCategory op a引入的目标似乎是错误。在存储库中的一个示例中,这些意外不匹配的目标和假设似乎能够自动配对,但不是在数据类型和环境的情况下。构造函数声明。我无法弄清楚确切的问题,但它似乎不适用于类型签名具有相同条件的普通函数声明。

存储库中给出了几个解决方案,但最简单的方法是替换约束参数,说明需要classChoice op a的实例,隐式参数类型为classChoice op a,并进行评估LogicSyntacticleCategory喜欢

feat : Type
feat = ?feat'

feat' = proof
  exact (LogicSyntacticleCategory Mult ZZ {P=%instance})

如果您在数据类型的主界面中设置了约束参数,则可以使用函数

包装LogicSyntacticleCategory : (op : Operator) -> (a : Type) -> {p : classChoice op a} -> Type的定义
logicSyntacticleCategory : classChoice op a => (op : Operator) -> (a : Type) -> Type
logicSyntacticleCategory = ?mkLogical

mkLogical = proof
    intros
    exact (LogicSyntacticleCategory op a {P=constrarg})

当你想要制作LogicSyntacticleCategory op a形式的类型时,像以前一样评估,但是

feat' = proof
  exact (logicSyntacticleCategory Mult ZZ)
  exact Mult
  exact ZZ
  compute
  exact inst -- for the named instance (inst) of (classChoice Mult ZZ)

为匿名实例删除最后一行。