как лень победить?

May 31, 2006 13:45

Не очень понимаю, как сделать некоторые вычисления 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?

haskell, lazy evaluation, программирование

Previous post Next post
Up