【发布时间】:2019-08-26 02:36:46
【问题描述】:
我想通过拆分一些东西来使它成为一个更简单的主要功能。但是当我添加一个新函数 maakNieuwSpel 我得到错误
maakNieuwSpel :: Int -> String -> IO ()
maakNieuwSpel aantal firstName= do let rijTegels = volleRijTegels
let spelers = deSpelers aantal firstName
w <- spelSpelen rijTegels spelers 0
putStrLn (w ++ "dit is waar ik mee bezig was in functie nieuwSpel")
当我用
在 main 中调用它时 eindstand <- maakNieuwSpel (digitToInt aantalTegenspelers) firstName
它给出了错误。
我尝试并想要实现的另一件事是通过放置 where 函数来重写 main 中的 let 函数。 我的想法是这样的
eindstand <- spelSpelen rijTegels spelers 0
where rijTegels = volleRijTegels
spelers = deSpelers (digitToInt aantalTegenspelers) firstName
然后它说“输入‘=’时出现解析错误,也许你需要在‘do’块中添加一个‘let’?”
这是我的代码的一部分。我想这会让你对我在做什么有足够的了解。
data Dobbelsteen = Steen Char -- now its values can be specified
deriving (Show, Eq)
data Tegel = Teg Int Int
deriving (Show, Eq)
data Speler = Spel Tactiek Spelersstapel String
type Tactiek = ([Dobbelsteen] -> [Dobbelsteen] -> IO [Dobbelsteen], [Dobbelsteen] -> Int -> IO Bool)
type Spelersstapel = [Tegel]
main :: IO ()
main = do putStrLn ("Hoi! Je speelt regenwormen. Wat is je naam?")
firstName <- getLine
putStrLn ("Beste "++ firstName ++ ", je speelt tegen twee computertegenstanders. Ze heten Lap en Top.")
putStr "Tegen hoeveel computertegenstanders wil u spelen? (Dit spel is voor 2 tot 8 personen) "
aantalTegenspelers <- getChar
let rijTegels = volleRijTegels
let spelers = deSpelers (digitToInt aantalTegenspelers) firstName
eindstand <- {-maakNieuwSpel (digitToInt aantalTegenspelers) firstName-} spelSpelen rijTegels spelers 0
putStrLn ("Het spel is afgelopen. De eindstand is " ++ eindstand)
spelSpelen :: [Tegel] -> [Speler] -> Int -> IO String -- de RijTegels, de spelers en degene die gaat spelen (int)
spelSpelen [] spelers spelerNr = do return (show (bepaalEindStand spelers))
spelSpelen rijTegels spelers spelerNr = do let Spel tactiek stapel naam = (spelers !! spelerNr)
putStrLn ("Deze speler is nu aan de beurt: " ++ naam)
score <- beurt tactiek (\x -> elem x (bepaalGeldigeScore spelers naam rijTegels))
let rijTegelsNieuw = pakTegelAlsMogelijk rijTegels score
let rijTegelsTeruggelegdNieuw = legTegelTerug spelers rijTegels score
let spelersAfgepaktNieuw = pakTegelAf spelers score
let spelersNieuw = voegTegelToeAanSpelerVanStapel spelersAfgepaktNieuw score naam rijTegelsTeruggelegdNieuw
putStrLn ("De beurt van speler " ++ naam ++ " is nu afgelopen.")
printStatus rijTegelsNieuw spelersNieuw
spelSpelen rijTegelsNieuw spelersNieuw ( (spelerNr+1) `mod` 3)
volleRijTegels :: [Tegel] -- deze functie maakt de rij tegels van 21 tot 36.
volleRijTegels = zipWith Teg [21..36] (replicate 4 1 ++ replicate 4 2 ++ replicate 4 3 ++ replicate 4 4)
deSpelers :: Int -> String -> [Speler]
deSpelers aantalTegenspelers firstName = do [Spel computerTactiek [] firstName, Spel computerTactiek [] "Lap", Spel computerTactiek [] "Top"]
【问题讨论】:
-
您有许多缩进错误。除非有缩进的理由,否则代码必须缩进与前一行相同的量。多行
do块的第二行必须缩进以匹配do关键字之后的文本。 -
修复缩进错误并为所有未定义变量添加占位符后,您发布的最终代码 sn-p 编译正常。 Here are my changes。 MCVE 会很有帮助。
标签: function haskell url-rewriting let