Ich möchte einen Typkonstruktor definieren, der das Konzept der Verwendung eines Typwrappers zum Definieren der Gleichheit in einem Domänen-Typ t1
durch Projektion auf einen Domänen-Typ t2
mit einer Funktion p
verkörpert.Kann ich das allgemeine Konzept von x == y = p (x) == p (y) in Idris definieren?
Das folgende spezielle Beispiel funktioniert, wo t1
= ABC
, t2
= Nat
und p
die Funktion abc_2_nat
ist:
%default total
data ABC = A | B | C
abc_2_nat : ABC -> Nat
abc_2_nat A = 1
abc_2_nat B = 1
abc_2_nat C = 2
data Projected_abc : Type where
Project_abc : ABC -> Projected_abc
Projected_abc_equals : Projected_abc -> Projected_abc -> Bool
Projected_abc_equals (Project_abc x) (Project_abc y) = abc_2_nat x == abc_2_nat y
Eq Projected_abc where
(==) = Projected_abc_equals
Aber, wenn ich zu verallgemeinern versuchen, wie folgt:
data Projected : t1 -> t2 -> (p: t1 -> t2) -> Type
where Project : t1 -> Projected t1 t2 p
Projected_equals : Projected t1 t2 p -> Projected t1 t2 p -> Bool
Projected_equals (Project x) (Project y) = ?hole
I Holen Sie sich dieses Loch:
- + Main.hole [P]
`-- phTy : Type
t2 : phTy
p : Type -> phTy
t1 : Type
x : t1
y : t1
--------------------------
Main.hole : Bool
Dies funktioniert nicht, weil es nicht erkennt, dass vom Typ t1->t2
ist (was ich will).
Ich vermute, dass ich zu viel frage, um die Projektionsfunktion als Argument für einen Typkonstruktor zu liefern, und irgendwie die Projektionsfunktion im Rahmen der Definition einer Funktion zur Verfügung haben, deren Parameter zum konstruierten Typ gehören.
Gibt es einen Weg, wie ich das zum Laufen bringen kann?
das behebt mein Problem. Mein grundlegender Fehler war, Typen und Werte in der Definition des Typs von "Projected" zu verwirren. Wie es passierte, akzeptierte Idris meine Definition als gültig (weil in Idris-Typen _are_ Werte sind, so ist es nicht unbedingt ungültig, einen an die Stelle des anderen zu setzen). Aber als ich ein Proof-Loch kompilierte, waren die Typen anders als ich erwartet hatte. Die Moral ist also, wenn Sie ein Beweisloch sehen, in dem die Typen seltsam oder verwirrend wirken, überprüfen Sie, dass Sie Typen und Werte in einer früheren Definition, von der das Loch abhängt, nicht verwechselt haben. –
@PhilipDorrell Ja, eine andere Moral ist: das Spezifizieren von Arten von Dingen hilft explizit, Fehler so früh wie möglich zu vermeiden. – Shersh