У меня есть тип данных в Идрисе:Выбор класса типов по строительству типа данных
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
Теперь мой вопрос: Как я могу гарантировать, что объекты моего типа данных проверяются и соединить четыре отдельных типа данных в один. Я действительно хотел бы убедиться, что это верно во время строительства. Я могу понять, что сейчас возникают трудности с решением класса типа, но я хочу, чтобы Идрис обеспечил, чтобы он мог это сделать позже во время строительства. Как я могу это сделать?
Код на самом деле не нужен, я вполне доволен направлением мысли.
Спасибо, версия в порядке. Я вижу, что идис сильно изменился, так как я пытался это выяснить, но ваш ответ все еще помог мне. Я обновил вопрос, поэтому незначительные ошибки исчезли. –