我在 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 确保它可以在构建过程中稍后完成。我怎样才能做到这一点?
代码并不是真正需要的,我对思想方向感到非常满意。