Ich versuche, so viel von System F (polymorphe Lambda-Kalkül) zu implementieren, wie ich in Idris kann. Ich bin jetzt mit einem Problem konfrontiert, dass ich mit einem Beispiel demonstrieren will:Gleichheit der Werte überträgt sich nicht auf Typen, die von diesen Werten abhängen; Fehle ich etwas?
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
Wie Sie sehen können, wird alle zwei Foo
Werte gleich sind. Ich würde jetzt in der Lage sein mag, diese Tatsache zu nutzen, während Gleichheit auf Baz f
definieren: Quux a
hat Baz (Foo a)
geben, hat Quux b
Baz (Foo b)
eingeben und Foo a
und Foo b
gleich sind, so meine Intuition ist, dass dies funktionieren soll. Aber der Compiler lehnt es ab und sagt, dass es einen Typ-Mismatch zwischen Baz (Foo a)
und Baz (Foo b)
gibt.
Gibt es eine Möglichkeit, dies zu erreichen? Dieses Problem hindert mich daran, die Alpha-Äquivalenz zu implementieren.
Mein Rat ist [_nicht Alpha Äquivalenz zu implementieren_] (https://en.wikipedia.org/wiki/De_Bruijn_index) –