Beziehung zwischen Vorwärts- und Rückwärts-Map in Isomorphie (Lens-Paket)

8

Warum sollte / sollte nichts darauf abstellen, dass s isomorph zu t ist und b isomorph zu a in einer Isomorphie vom Typ Iso s t a b ?

Ich verstehe, dass wir eine Vorwärtszuordnung s -> a und eine Rückwärtszuordnung b -> t haben, aber warum ist diesen Zuordnungen in

keine Beziehung auferlegt %Vor%     
user3585010 28.09.2014, 06:18
quelle

1 Antwort

3

Was Sie isomorph machen möchten, ist nicht s bis t oder a bis b , sondern stattdessen s bis a und t bis b . Betrachten Sie das Beispiel:

%Vor%

Hier stellen wir die Iso swapped mit der Lens _1 zusammen; In dieser Verwendung entspricht ihre Zusammensetzung der Lens _2 , und so wird show auf das zweite Element des Tupels (True, ()) angewendet. Beachten Sie, dass show den Typ ändert. Also, um welchen Typ benutzen wir eigentlich Iso swapped hier?

  • s ist der Typ unseres ursprünglichen Tupels, (Bool, ())
  • t ist der Typ des Endergebnisses, (Bool, String)
  • a ist der Typ von s nach dem Austausch, ((), Bool)
  • b ist der Typ von t vor dem Zurücktauschen, (String, Bool)

Mit anderen Worten verwenden wir swapped am Typ

%Vor%

Jede der Abbildungen s -> a und b -> t ist eine Bijektion, aber es gibt keine solche notwendige Beziehung zwischen den anderen Typen.

Warum gibt es keine aufgelisteten Gesetze für Iso s, die sagen, dass dies Bijektionen sein müssen, weiß ich nicht.

EDIT: Der Abschnitt "Warum ist es eine Objektivfamilie?" in dem Link, der von @bennofs in den obigen Kommentaren gepostet wurde, hat einige Dinge für mich geklärt. Offensichtlich beabsichtigt Edward Kmett, dass diese Typen nicht völlig frei variieren können.

Obwohl es in den Typen einer Optik nicht direkt ausgedrückt werden kann, ohne dass es umständlich ist, sie zu verwenden, Die Absicht ist, dass eine typändernde Optikfamilie ( Lens , Iso oder andere) Typen haben sollte, die durch die Typfamilien inner und outer gegeben sind. Wenn einer der Typen von Iso

ist %Vor%

Dann sollte es zwei Indextypen geben: i und j , so dass

%Vor%

Außerdem dürfen Sie i und j tauschen, und obwohl dies nicht automatisch durchgesetzt wird, sollte das Ergebnis noch für Ihre polymorphe Iso legal sein. I.e. Sie sollten auch anIso am Typ

verwenden können %Vor%

Das gilt eindeutig für swapped . Beides sind legale Typen dafür:

%Vor%

Mit anderen Worten: Wenn eine polymorphe Iso -Familie typenverändernd ist, muss auch die umgekehrte -Typänderung unterstützt werden. (Auch zusammengesetzte Typänderungen. Ich rieche hier eine natürliche Verwandlung aus der Kategorientheorie, was meiner Meinung nach auch eine Art ist, wie Kmett daran denkt.)

Beachten Sie auch, dass wenn Sie eine polymorphe Iso als

konstruiert haben %Vor%

Damit dies auch den Typ iso f g :: Iso t s a b hat, müssen f und g ebenfalls die Typen

haben %Vor%

Beachten Sie, dass f , das am ersten Typ s -> a verwendet wird, den richtigen Typ hat, der die Umkehrung von g ist, der an seinem zweiten Typ a -> s verwendet wird, und umgekehrt.

Für ein konkretes Beispiel ist swapped hier ein wenig schlecht, da seine f und g , die für Tupel verwendet werden, identisch sind, im Wesentlichen sind sie beide \(x,y) -> (y,x) , was eine eigene Umkehrung ist. Und das beste andere nicht Simple Beispiel, das ich in Control.Lens.Iso sehe, ist curried , was etwas zu kompliziert erscheint, um es zu klären.

    
Ørjan Johansen 28.09.2014, 07:00
quelle

Tags und Links