Следующая функция f
попытки прочитать Int
дважды, используя IO (Maybe Int)
функцию дважды, но «короткие замыкания» исполнение после того, как успешно читает один Int
:Рефакторинг «лестничный» с корпусом из `значений Maybe` в` 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
Есть ли хороший способ реорганизовать этот код? Это было бы получить очень волосатый, если я продлил его до трех попыток ...
(Мой мыслительный процесс: Видя это «лестничный» говорит мне, что, может быть, я должен использовать в Monad
экземпляр Maybe
, но так как это уже в IO
монады я бы тогда использовать MaybeT
(?). Тем не менее, мне нужно только один из readInt
, чтобы добиться успеха, так что поведение Maybe
монады из erroring на первой Nothing
бы здесь не так ...)
Возможно, уточните в пользу других, что он должен был бы провести вычисление 'IO (Maybe Int)' в конструкторе 'MaybeT' –