2013-04-02 5 views
9

Ich benutze das Linsenpaket und denke immer, es muss eine einfache Lösung für das folgende Problem geben. Sagen, dass ich eine Karte (oder jede At Instanz) und eine Linse auf seinem Wert Typ, dhKomponieren von Teilgettern mit der Objektivbibliothek

aMap :: Map Int a 
aLens :: Simple Lens a b 

ich ein Getter

g :: Getter (Map Int a) (Maybe b) 

Dies ist, weil ich oft so etwas wie diese

will tun wollen
x :: Maybe b 
x = aMap^.at 3.g.aLens 

die beabsichtigte Semantik natürlich sein, dass Sie einen Just Wert erhalten, wenn Sie so in dem at Lookup und Nothing anders.

Wenn man anstatt sich anstelle von gtraverse Werkseinstellung, dh

newMap = at 3.traverse.aLens .~ whatever $ aMap 

aber nicht, wenn Sie bekommen. Gibt es eine fertige Linse in der Bibliothek, die ich einfach vermisst habe, oder gibt es eine andere einfache Möglichkeit, dies in einem einzigen Ausdruck zu erreichen?

Antwort

4

Ich bin auf ein ähnliches Problem gestoßen, das versucht, Linsen mit at zu bilden.

Wenn Sie das Einfüge-/Löschverhalten von at hier nicht benötigen, was ist mit ix?

x :: Maybe b 
x = aMap ^? ix 3 . aLens 
3

Ich habe es geschafft, mit

x :: Maybe b 
x = aMap^.at 3 <&> (^.aLens) 

zu kommen, die ein wenig verwirrend und nicht genau, was ich suchte, aber bekommt den Job zu erledigen.

Verwandte Themen