【发布时间】:2021-01-19 03:36:55
【问题描述】:
我想编写一个具有交互式提示并且可以保存和显示所有以前输入的玩具程序。这是我的第一次尝试,但没有编译(使用 ghc):
import System.IO
import Control.Monad.State
data ProgramState = ProgramState
{ events :: [Int] } -- Placeholder for now
parse_input :: String -> State ProgramState Bool
parse_input prompt = do
putStr prompt
hFlush stdout
current_state <- get
str <- getLine
case str of
"c" -> do
put (current_state { events = [1,2,3] } ) -- this should become actual appending
return True
"l" -> return True
"q" -> return False
"quit" -> return False
"h" -> return True
_ -> do
putStrLn "Invalid input."
parse_input prompt
main :: IO ()
main = do
should_continue <- parse_input "Enter your command."
if should_continue then main else return ()
main.hs:9:5: error:
• Couldn't match type ‘IO’
with ‘StateT ProgramState Data.Functor.Identity.Identity’
Expected type: StateT
ProgramState Data.Functor.Identity.Identity ()
Actual type: IO ()
注意:第 9 行是putStr prompt
第 10、12、22、27 行给出了相同的错误。
从那以后我就想到纯粹在 parse_input 内部进行递归,在这种情况下,我似乎不需要 state monad。但我仍然很好奇为什么会出现编译错误。感谢任何帮助,我对 Haskell 很陌生。
【问题讨论】:
标签: haskell recursion io state monads