Prendiamo due funzioni:Piano B, o qual è l'opposto di Maybe's >> =?
f :: a -> Maybe b
g :: b -> Maybe c
La funzione >>=
potrebbe funzionare in modo tale che sarebbe f >>= g
eseguire g
con il risultato di f
solo se non è Nothing
. In altre parole, richiede sia f
che g
per riuscire a produrre qualsiasi risultato.
Sto implementando un parser e mi sono reso conto che il mio lexer avrebbe beneficiato di un risultato opposto. Cioè:
f :: a -> Maybe b
g :: a -> Maybe b
planb :: (a -> Maybe b) -> (a -> Maybe b) -> (a -> Maybe b)
planb f g = \x -> case f x of
Nothing -> g x
res -> res
che significa provare f
e se non riesce, provare g
come un piano di backup. Con un lexer significa provare ad abbinare un tipo di token con l'input corrente e, se fallisce, prova ad abbinare un altro tipo di token (che alla fine sarà incatenato per tutti i tipi di token).
La ricerca di Hoogle non ha comportato alcuna di tali funzioni, ma per me una tale funzione sembra essere utile in molti posti!
La mia domanda è quindi se esiste già una variante di planb
che dovrei usare? Se no, sto facendo qualcosa di straordinario e c'è un modo migliore per ottenere ciò che voglio?
P.S. Ho pensato se una tale funzione ha senso per Monad
s in generale, ma non ha molto senso per me al di fuori di Maybe
e forse pochi altri.
suono come cerchi [ 'MonadPlus'] (http://www.haskell.org/haskellwiki/MonadPlus). – Franky
@Franky dovresti fare una risposta. –
BTW Non vedo un motivo per un lambda qui. 'planb f g x = case f x ...' funziona. Forse la parentesi (inutile) intorno all'estrema destra 'a -> Forse b' ha oscurato la tua vista. Forse è solo una questione di preferenza. – Franky