Alles, was ich weiß, ist, dass das eine funktioniert und das andere nicht.Was ist der Unterschied zwischen `ix` und` at` in der Objektivbibliothek von Haskell
Kontext: Ich habe eine Datenstruktur, die F
S
eine Data.Map.Map k S
auf eine andere Datenstruktur enthält. Mein Ziel war es, eine Lens
zu bauen, die bei F
und k
ein Feld in S
beschreiben würde.
Die Schwierigkeit besteht darin, dass der Schlüssel k
möglicherweise nicht in der Karte vorhanden ist. Das ist in Ordnung, die Funktion kann ihre Rückkehr in Maybe wickeln. Allerdings konnte ich ein Objektiv nicht durch ein Maybe mit at
propagieren. Nachdem ich viele Stack Overflow Antworten gelesen hatte, stieß ich auf this one.
Es stellt sich heraus, dass at
mit ix
ersetzt meine Art Probleme gelöst wenn ich auch (^.)
mit (^?)
ersetzt.
Frage: Es scheint wie at
und ix
das gleiche tun, zumindest in Bezug auf Map
. Beide nehmen einen Schlüssel und geben dem Wert an dieser Taste eine 'Linse'. Allerdings scheint ix
mit dem Funktionszusammensetzungsoperator (.)
nett zu spielen. Was ist der Unterschied zwischen den beiden?
Off Topic Rant:
Ich mag Infixoperatoren so viel wie der nächste Kerl, aber das Control.Lens Paket scheint über Bord ein wenig gegangen zu sein. Für einen neuen Benutzer mit einigen englischen Namen und einem Schlüssel irgendwo würde die Lernkurve senken. Aufgrund der großen Anzahl von Wrapper-Klassen, die in der Lens-Bibliothek verwendet werden, ist es besonders schwierig, die Typ-Signaturen zu durchsuchen, wenn Sie nicht bereits wissen, was vor sich geht. Mein Code fängt an, wie Perl um Himmels Willen zu aussehen.
Sie können mit 'lens' ohne einen einzigen Infixoperator. Fast jeder Operator ist nur ein praktischer Alias für einen Nicht-Operator-Namen - Sie müssen ihn nicht verwenden (und ich tue es oft nicht). – shachaf
Was Sie nicht tun können, ist zu versuchen, einen Code zu verstehen, den andere geschrieben haben, sagen wir, den Beispielordner für Bibliotheken. Der Prozess, in GHCi etwas Code zu kopieren und darauf zu schlagen, ist in Lens wesentlich schwieriger als in den meisten anderen Bibliotheken. –
@Shachaf das ist nicht wahr: einige sehr nützliche Operatoren existieren nicht als Wörter, nämlich '% =' (nicht so schlecht, da es in 'do' Blöcken verwendet wird) und'? ~ '(Ziemlich schlecht, da es wirklich rein ist Code, der den Wechsel von '$' zu '&' erfordert, wenn Sie keine Parens laden wollen. – spopejoy