In this answer zeigt Gabriel Gonzalez, wie man zeigt, dass id
der einzige Einwohner von forall a. a -> a
ist. Um dies zu tun (in der formalsten Iteration des Beweises), zeigt er, dass der Typ isomorph zu ()
unter Verwendung der Yoneda lemma ist, und da ()
nur einen Wert enthält, so muss der Typ id
sein. Zusammengefasst ist sein Beweis wie folgt aus:Wie zeige ich, dass ein Haskell-Typ von einer einzigen Funktion bewohnt wird?
Yoneda sagt:
Functor f => (forall b . (a -> b) -> f b) ~ f a
Wenn
a =()
undf = Identity
wird daraus:(forall b. (() -> b) -> b) ~()
Und da trivialer
() -> b ~ b
, die LHS ist im Grunde die Art vonid
.
Das fühlt sich an wie ein "magischer Trick", der gut funktioniert für id
. Ich versuche, dasselbe für eine komplexere Funktion zu tun:
aber ich habe keine Ahnung, wo ich anfangen soll. Ich weiß, dass es von \f g x = g (f x) x
bewohnt wird, und wenn Sie hässliche ⊥
/undefined
Zeug ignorieren, bin ich ziemlich sicher, dass es keine anderen Funktionen dieses Typs gibt.
Ich glaube nicht, Gabriels Trick wird sofort gelten hier, egal wie ich die Typen auswählen. Gibt es andere Ansätze (die genauso formal sind), mit denen ich den Isomorphismus zwischen diesem Typ und ()
zeigen kann?
Ahh, ich hatte gedacht Curry zu verwenden, um '((a, b) -> c)', aber nicht die Reihenfolge der Argumente zu ändern, irgendwie - das hat den Trick! – Lynn
Sie können auch 'f' als kovarianten Hom-Funktor anstelle von' Id' nehmen: '(a -> b -> c) -> b -> c' ~' ((a, b) -> c) -> (->) bc' ~ b -> (a, b) '. – user3237465
könnten Sie bitte vollständig die "Forall b a. (b -> a) -> b -> für alle c. (a -> b -> c) -> c' Typ, um den Geltungsbereich jedes Foralls explizit zu sehen? –