La seguente funzione f
tentativi di leggere un Int
due volte utilizzando una funzione IO (Maybe Int)
due volte, ma “cortocircuiti” esecuzione dopo aver letto con successo uno Int
:Refactoring “gradinata” con il caso di `` valori Maybe` in codice IO`
readInt :: IO (Maybe Int)
f :: IO (Maybe Int)
f = do
n1 <- readInt
case n1 of
Just n' -> return (Just n')
Nothing -> do
n2 <- readInt
case n2 of
Just n' -> return (Just n')
Nothing -> return Nothing
C'è un buon modo per refactoring questo codice? Questo otterrebbe molto peloso se ho esteso a tre tentativi ...
(Il mio processo di pensiero: Vedendo questo “gradinata” mi dice che forse dovrei usare l'istanza Monad
di Maybe
, ma poiché questa è già in IO
Monade , avrei quindi dovuto usare MaybeT
(?). Tuttavia, ho solo bisogno di una del readInt
per avere successo, quindi il comportamento del Maybe
monade erroring sul primo Nothing
sarebbe sbagliato qui ...)
Forse chiarire a beneficio degli altri che avrebbe dovuto completare il calcolo 'IO (Forse Int)' nel costruttore 'MaybeT' –