2014-02-28 6 views
10

Viele Linsen Getters Return Vielleicht Werte. Und ich muss sie oft durch einige Standard ersetzen.Getting Maybe von Objektiv mit Standardwert

Sagen Sie Kartensuche, aber mit Standard.

fromMaybe "" $ Map.fromList [(1,"Foo")] ^? at 1 

Kann dies mit Linsen-Syntax geschrieben werden? Vielleicht etwas in der Nähe:

Map.fromList [(1,"Foo")] ^? at 1.or "" 

Antwort

10

denke ich, was wollen Sie

non :: Eq a => a -> Iso a (Maybe a) 

non foo ist im Wesentlichen tut

case someMaybe of 
    Nothing -> foo 
    Just a -> a 

In Ihrem Fall

someMap ^. at 1 . non "" 

Zufälligerweise thi s ist genau das Beispiel von non der geben.

Wenn Sie diese verwenden, um mit ix Sie kein Glück, aber man kann immer tun

-- Import Data.Monoid 
defaulting :: a -> s -> Getting (First a) s a -> a 
defaulting a s fold = fromMaybe a $ s ^? fold 

foo = defaulting 0 [1, 2, 3] $ ix 3 -- 0 
+0

Ehrfürchtig Dank !. Funktioniert wie ich will. Ich frage mich jedoch, warum sie es nicht genannt haben? Komischer Name. "oder" wäre so viel klarer gewesen. –

+0

@VagifVerdi Es sollte ein Mapping von 'a' sein ohne irgendeinen Wert, der an' Maybe a' geliefert wird, also in diesem Sinne macht es ein bisschen mehr Sinn – jozefg

+0

Hmm, fällt in manchen Fällen nicht aus. Funktioniert mit ^. at, funktioniert nicht mit ^? ix. Gibt es eine Möglichkeit, es irgendwie auf ix anzuwenden? –