這是學習StateT monad的練習。該程序實現了遊戲莫拉。這兩名球員是電腦和一個人。國家累計電腦和玩家的分數。該程序適用於morra函數的一個迭代。然而,我不知道如何循環它。我嘗試了一些東西,但似乎沒有任何工作。與StateT monad環路
module Morra where
import Control.Monad.Trans.State.Lazy
import Control.Monad.IO.Class
import Data.Char (isDigit, digitToInt)
import System.Random (randomRIO)
import Control.Monad (when)
morra :: StateT (Int, Int) IO()
morra = do
p <- liftIO getChar
when (isDigit p) $
do
let p' = digitToInt p
c <- liftIO $ randomRIO (1, 2)
liftIO $ putStrLn ['P',':',' ',p] --"P: " ++ p)
liftIO $ putStrLn ("C: " ++ show c)
(pt, ct) <- get
if even (c + p') then
do
liftIO $ putStrLn "Computer Wins"
put (pt, ct + 1)
else
do
liftIO $ putStrLn "Player Wins"
put (pt + 1, ct)
main :: IO()
main = do
putStrLn "-- p is Player"
putStrLn "-- c is Computer"
putStrLn "-- Player is odds, Computer is evens."
fScore <- runStateT morra (0,0)
let personS = fst . snd $ fScore
compS = snd . snd $ fScore
putStrLn ("Person Score: " ++ show personS)
putStrLn ("Computer Score: " ++ show compS)
if personS > compS then
putStrLn "Winner is Person"
else
putStrLn "Winner is Computer"
感謝您的。不過,我需要Morra函數的循環。函數main只能運行一次。如果我將'morra'放在函數的末尾(與'when'後面的'do'一致),則什麼都不會發生。 – user1897830
@ user1897830你需要把它和'when'(只縮進兩個空格)放在一起。如果你把它放在when中,它只會在'isDigit p'爲true時循環。 「什麼都沒有發生」是什麼意思?它會立即退出,還是會陷入循環? – Lazersmoke
我需要它僅在'isDigit p'爲true時循環。這是循環直到'isDigit p'不正確,然後退出。但是,當我把morra放在它剛剛退出並且不循環的時候。 – user1897830