gpt4 book ai didi

haskell - 循环 StateT : Why this loop doesn't loop

转载 作者:行者123 更新时间:2023-12-03 14:31:47 29 4
gpt4 key购买 nike

我不明白为什么这段代码只循环一次然后退出?
在 Ghci 中,我只能回答第一个循环,然后似乎变量 cont 设置为 false 并且我没有提示回答。

结果是:

*Main> testLoop1 td10
test
Do you want to continue? (y/N)
y
we continue
test
Do you want to continue? (y/N)
We stop

代码:
type TDeckSTIO    = StateT TableDecks IO

continue = do
putStrLn "Do you want to continue? (y/N)"
c <- getChar
return $ c == 'y'


loop1 :: TDeckSTIO ()
loop1 = do
liftIO $ putStrLn "test"
cont<- liftIO continue
if cont
then do
liftIO $ putStrLn "we continue"
liftIO $ testLoop1 td

else liftIO $ putStrLn "We stop"

testLoop1 td = runStateT (loop1 ) td >> return ()

最佳答案

问题是当你输入 y 时然后按回车键,实际上是在输入两个字符:'y'本身,以及按回车键发送的换行符。第一轮,循环看到 'y' ,但下一次,它会看到 '\n' ,以及自 '\n'不是 'y' ,它退出。

你可以做 hSetBuffering stdin NoBuffering在您进入循环之前(您需要导入 System.IO ),这将使您无需等待换行符即可处理字符,或者一次专门处理行:

continue = do
putStrLn "Do you want to continue? (y/N)"
s <- getLine
return $ s == "y"

顺便说一句,而不是写 liftIO $ testLoop1 td ,你可以保持在同一个状态 monad:你可以用 loop1 替换它它的工作原理完全相同。

另外, testLoop1最好写成:
testLoop1 = evalStateT loop1
evalStateT就像 runStateT ,但不包括最终状态,因此您不必使用 >> return () 显式丢弃该值.

关于haskell - 循环 StateT : Why this loop doesn't loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974164/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com