Я пытаюсь реализовать как можно больше System F (полиморфное лямбда-исчисление), как я могу в Идрисе. Теперь я столкнулся с проблемой, которую я хочу показать на примере:Равенство значений не переносится на типы, зависящие от этих значений; я что-то упускаю?
data Foo = Bar Nat
Eq Foo where
(Bar _) == (Bar _) = True
data Baz: Foo -> Type where
Quux: (n: Nat) -> Baz (Bar n)
Eq (Baz f) where
(Quux a) == (Quux b) = ?todo
Как вы можете видеть, любые два Foo
значения равны. Теперь я хотел бы, чтобы иметь возможность использовать этот факт при определении равенства на Baz f
: Quux a
имеет тип Baz (Foo a)
, Quux b
имеет тип Baz (Foo b)
и Foo a
и Foo b
равны, так что моя интуиция, что это должно работать. Но компилятор отказывается от него, заявив, что существует несоответствие типа между Baz (Foo a)
и Baz (Foo b)
.
Есть ли способ сделать эту работу? Эта проблема мешает мне реализовать альфа-эквивалентность.
Мой совет [не применять альфа-эквивалентность_] (https://en.wikipedia.org/wiki/De_Bruijn_index) –