我遇到了一个IO执行顺序不正确的问题,即使在do结构内部也是如此。
在下面的代码中,我只是跟踪哪些卡片还剩下,其中卡片是字符元组(一张牌的花色和点数各为一个字符),然后用户会被连续询问哪些卡片已经打出。我希望putStr
在每次输入之间执行,并且不像现在这样在最后执行。
module Main where
main = doLoop cards
doLoop xs = do putStr $ show xs
s <- getChar
n <- getChar
doLoop $ remove (s,n) xs
suits = "SCDH"
vals = "A23456789JQK"
cards = [(s,n) | s <- suits, n <- vals]
type Card = (Char,Char)
remove :: Card -> [Card] -> [Card]
remove card xs = filter (/= card) xs