Не очень понимаю, как сделать некоторые вычисления eager. Кто знает, подскажите.
Допустим у меня есть простой шелл - State с одной целой переменной. В шелле поддерживается две команды
- r - прочесть целое значение
- w - вывести целое значение
Вот код:
import Control.Monad.State
import Data.Char
type TestShell = StateT Int IO ()
cmdRead :: String -> TestShell
cmdRead x =
do let i = read x
put i
return ()
cmdWrite :: String -> TestShell
cmdWrite _ =
do i <- get
liftIO (print i)
return ()
runCycle i =
do
putStr "> "
cmdLine <- getLine
let (cmdName, arg) = break isSpace cmdLine
arg' = dropWhile isSpace arg'
cmd = case cmdName of
"r" -> cmdRead
"w" -> cmdWrite
i' <- liftIO $ execStateT (cmd arg) i
runCycle i'
main = runCycle 0
Теперь, собственно, вопрос. Допустим, я сделал ошибку при наборе числа и ввел не "r 123", а скажем "r xpen". Ошибку мне шелл покажет только после команды "w". Вот:
*Main> main
> r xpen
> w
*** Exception: Prelude.read: no parse
А как мне сделать, чтобы ошибка показывалась после ввода команды r?