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
:
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.
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: