2016-02-01 2 views
0

J'ai un tuple x et une valeur MaybeyComment utiliser la fonction lens set avec Maybe?

x = (1,1) 
y = Just 2 

Je peux le faire

z = maybe x (\v -> x & _1 .~ v) y 

Ou je peux créer mon propre opérateur

(.~?) x y = x %~ (\v -> fromMaybe v y) 

z = x & _1 .~? y 

Mais si lens ne le fait pas avoir un tel opérateur, peut-être que je n'en ai pas besoin? Alors, comment utiliser la fonction lensset avec Maybe?

+1

Vous ne savez pas ce que vous essayez de faire ici - voulez-vous une fonction '(a, b) -> Peut-être un -> (a, a)' ou une fonction '(a, b) -> Peut-être -> Peut-être (a, b) '? – Cubic

+0

'(a, b) -> Peut-être un -> (a, a)', mais '(a, b) -> Peut-être un -> Peut-être (a, b)' serait aussi intéressant – ais

+0

Voulez-vous dire '(\ v -> x & _1. ~ v) 'à la place? – chi

Répondre

2

Il semble que vous voulez

maybeSetFst :: (a, b) -> Maybe a -> (a, b) 

qui mettra à jour le premier champ si on leur donne une valeur de mise à jour et laissera seul autrement. Je pense que la première mise en œuvre que vous donnez est très bonne, mais vous pouvez lui donner un type plus général:

maybeSetFst :: Field1 s s a a => s -> Maybe a -> s 

Si vous ne voulez pas cette généralité, vous pouvez sauter les lentilles et écrire (en utilisant TupleSections)

maybeSetFst [email protected](_,b) = maybe p (,b) 

Une autre option consiste à appliquer maybe pour obtenir la fonction de mise à jour:

maybeSetFst p m = maybe id (_1 .~) m p 

qui peut être écrit

maybeSetFst = flip $ maybe id (_1 .~) 

pour la sottise sans pointe.