Вы должны изменить тип возвращаемого значения на IO String вместо String.
Однако, возможно, вы хотите вернуть либо String String, чтобы функция указала, что он вернул текст прогресса игры Right "You do something"
, либо произошел сбой с объяснением ошибки Left "Not an option"
.
Затем вы вызываете цикл до тех пор, пока не получите значение Right
, и каждый раз, когда вы получаете значение Left
, вы печатаете текст и спрашиваете снова.
Я уверен, что есть немного лучший способ, но вот небольшой исправленный код:
module Main where
playerChoice :: String -> Either String String
playerChoice option
| option == "1" = Right "Sword - 50gp\nShield - 100gp"
| option == "2" = Right "You go fight some monsters outside town."
| option == "3" = Right "You go to the town Inn."
| option == "4" = Right "You go see the holy monk."
| otherwise = Left "You entered invalid information..."
displayOptions :: Int -> String
displayOptions option
| option == 0 = "1 - Shop\n2 - Fight Monsters\n3 - Inn\n4 - Monk\n"
| otherwise = "invalid"
main = do
let progress whathappens = do
putStrLn whathappens
let tryAsk prompt = do
putStrLn prompt
choice <- getLine
either tryAsk progress $ playerChoice(choice)
tryAsk $ displayOptions(0) ++ "What would you like to do?"
progress "The king has sent you on the journey to become a master."
если вы import Data.Function
, то вы также можете написать это следующим образом - что в этом случае, вероятно, не лучше, но это хороший мелкий шаг в увлекательную часть haskell:
fix (\moreProgress whathappens -> do
putStrLn whathappens
fix (\askAgain prompt -> do
putStrLn prompt
choice <- getLine
either askAgain moreProgress $ playerChoice(choice))
$ displayOptions(0) ++ "What would you like to do?")
$ "The king has sent you on the journey to become a master."