Was ist der Unterschied zwischen ix und element in der Lens-Bibliothek von Haskell?

8

In der Haskell-Linsenbibliothek können ix und element beide ein Int ein verwenden, z. um ein Listenelement in einem Index wie diesem zu lesen oder zu schreiben.

%Vor%

und ähnlich:

%Vor%

Was ist der Unterschied zwischen element und ix ?

    
Stephan 22.01.2015, 10:27
quelle

3 Antworten

11

Mit ix können Sie nicht nur nach Anzahl, sondern z. Geben Sie die Karten ein. Der element -Index in Traverse order.

%Vor%

Der Unterschied ist noch deutlicher bei z. IntMap

%Vor%     
phadej 22.01.2015, 10:45
quelle
4

element ist so definiert, dass es mit Typen der Klasse Traversable arbeitet, sogar mit Klassenmitgliedern, von denen die Linsenbibliothek nichts weiß. Als solches verwendet es nur Traversable -Funktionen, um auf den Wert zuzugreifen, die kein Konzept irgendeines für den Werttyp spezifischen Indextyps haben. Daher werden nur Int Indizes unterstützt, die Elemente in der üblichen Traversierungsreihenfolge ergeben.

element gibt auch IndexedTraversal , was einige zusätzliche Möglichkeiten zur Handhabung von Indizes gibt.

ix ist nur für Typen definiert, von denen die Linsenbibliothek weiß, kann dafür aber abhängig vom Typ des Wertes verschiedene Indextypen verwenden.

Für Listen geben sie das gleiche Ergebnis. Aber der Unterschied kann z.B. für Data.Map :

%Vor%

Wie Sie sehen können, wird% element der Karte mit Int indexes zugewiesen, während ix den Schlüsseltyp als Index erhält, und wenn man versucht, das umzuschalten, ergibt sich ein Typfehler.

    
Ørjan Johansen 22.01.2015 10:45
quelle
3

element funktioniert, indem eine gesamte Struktur durchlaufen wird, die Elemente gezählt werden und das Element mit dem Zielindex durchlaufen wird. Daher hat es immer die Zeitkomplexität O (n) in der Größe der Struktur, und es funktioniert nur mit Int Indizes.

Im Gegensatz dazu hat ix eine eigene Klasse Ixed , und Instanzen beruhen auf den Such- / Änderungsoperationen der spezifischen Datenstrukturen. Zum Beispiel ist ix für Data.Sequence O (log n).

Jedoch funktioniert ix nur bei bestimmten Datenstrukturen, während elementOf mit jedem Traversal , Lens oder Iso arbeitet, zum Beispiel:

%Vor%     
András Kovács 22.01.2015 11:45
quelle

Tags und Links