Я пытаюсь реализовать как можно больше System F (полиморфное лямбда-исчисление) в Idris. Теперь я столкнулся с проблемой, которую хочу продемонстрировать на примере:
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)
есть несоответствие типов.
Есть ли способ заставить это работать? Эта проблема мешает мне реализовать альфа-эквивалентность.