как лень победить?
May. 31st, 2006 01:45 pmНе очень понимаю, как сделать некоторые вычисления eager. Кто знает, подскажите.
Допустим у меня есть простой шелл - State с одной целой переменной. В шелле поддерживается две команды
Вот код:
Теперь, собственно, вопрос. Допустим, я сделал ошибку при наборе числа и ввел не "r 123", а скажем "r xpen". Ошибку мне шелл покажет только после команды "w". Вот:
*Main> main
> r xpen
> w
*** Exception: Prelude.read: no parse
А как мне сделать, чтобы ошибка показывалась после ввода команды r?
Допустим у меня есть простой шелл - 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?
no subject
Date: 2006-05-31 10:47 am (UTC)no subject
Date: 2006-05-31 10:50 am (UTC)Что надо сменить:
cmdRead :: String -> TestShell cmdRead x = do let i = read x put $! i return ()f $! x = форсировать x и вычислить (f x).
no subject
Date: 2006-05-31 11:07 am (UTC)no subject
Date: 2006-05-31 11:08 am (UTC)а еще..
Date: 2006-06-23 08:50 am (UTC)Re: а еще..
Date: 2006-06-23 09:13 am (UTC)