haskell - Haskell 中用于 CLI 应用程序的 IO 状态
问题描述
我正在尝试在 Haskell 中编写游戏 Hangman 的简单实现,我遇到的一个问题是保持游戏状态。
我的问题的简化/抽象版本如下所示:
advanceState :: Char -> [Char] -> [Char]
advanceState = (:)
我的问题似乎很简单,但我想不出答案:如何在通过标准输入提供的每个字符之后调用此函数,以及如何在读取特定字符集后终止循环?
请注意,我也尝试过有State [Char] a
但StateT [Char] IO a
无济于事的版本。
解决方案
这个问题的一个简单的解决方案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
.
推荐阅读
- php - (preg_match ('#^/thank-you/hello/#', $_SERVER['REQUEST_URI'])
- reactjs - 将对象数组传递给功能组件和映射
- jsxgraph - 为什么jsxgraph抛物线不能很好地渲染虚线
- css - 有没有办法阻止你想要的第 n 个(n)个孩子?
- java - 我怎样才能在android中播放声音
- prolog - 返回值高于序言中的数字
- php-7 - 如何在 php7 中启用仅翻译一个字段/div 的内容?
- flutter - 颤振带有文本的自定义标记
- react-native - MapboxGL React Native UserLocation Indicator 不显示在地图上
- css - 是否可以在编译期间将选择 SCSS @import partial 出列?