首页 > 解决方案 > Haskell 中用于 CLI 应用程序的 IO 状态

问题描述

我正在尝试在 Haskell 中编写游戏 Hangman 的简单实现,我遇到的一个问题是保持游戏状态。

我的问题的简化/抽象版本如下所示:

advanceState :: Char -> [Char] -> [Char]
advanceState = (:)

我的问题似乎很简单,但我想不出答案:如何在通过标准输入提供的每个字符之后调用此函数,以及如何在读取特定字符集后终止循环?

请注意,我也尝试过有State [Char] aStateT [Char] IO a无济于事的版本。

标签: haskellstateimmutability

解决方案


这个问题的一个简单的解决方案IO是使用内部loop函数,它保持其状态作为参数。我将在下面提供一个人工示例:

myProgram :: IO [Char]
myProgram = loop []
  where
    loop :: [Char] -> IO [Char]
    loop state = do
        input <- getLine
        case input of
            "A" -> do
                putStrLn "Advancing state with A"
                loop ('A' : state)
            "B" -> do
                putStrLn "State didn't change"
                loop state
            _ -> do
                putStrLn "Finishing game"
                pure state  -- recursion ends here

因此,递归和模式匹配的组合允许您根据输入更改状态。因此,当您loop下次调用时,它会给出一个可能的 new state.


推荐阅读