我有下面的主函数,它应该向两个玩家询问他们的棋盘,这些棋盘是从另一个文件中的棋盘库中选择的,然后用这些输入运行一个循环。
main :: IO()
main = do {
putStr "Player1 choose deck\n";
d1 <- getLine;
case d1 of
{
"deck1" -> let {d1 = deck1};
_ -> putStr "error"
};
putStr "Player2 choose deck\n";
d2 <- getLine;
case d2 of
{
"deck1" -> let {d2 = deck1};
_ -> putStr "error"
};
loop d1 d2
}代码在代码行的分号上出现解析错误:
"deck1" -> let {d1 = deck1};
"deck1" -> let {d2 = deck1};我已经盯着这个看了很久了,我相信这是很简单的事情,但我希望能有一双新的眼睛来看看哪里出了问题。:)
发布于 2018-05-24 03:14:17
Haskell的let在do块中的行为与在do块之外的行为不同。由于语法为let in,因此语句let {d2 = deck 1};的格式不正确。要解决这个问题,您可以将其包装在一个do中(例如:do let {d2 = deck1};),这应该可以解决解析错误,但这并不是您想要的。
OP中的代码有如此多的错误,以至于我不确定从哪里开始,但这里有一些提示:
getLine填充它,但随后将它赋值给deck1,这可能不是do外部的getLine表示法必须跟在let BINDING in VALUE之后。let BINDING不是一个值,它本身没有任何意义。此外,let BINDING in VALUE仅在值中应用绑定。do的let的特别之处在于它将绑定应用于它后面的所有行,但该绑定没有被覆盖。(例如:do { let x = ""; putStrLn x }实际上只是pure "" >>= \x -> putStrLn x (或者可能是return "" >>= \x -> putStrLn x,或者可能是(\x -> putStrLn x) "").)的语法糖
尝试完全避免do notation,我认为您会感到困惑,因为do notation允许Haskell看起来像Java一样势在必行,但Haskell不是Java。您应该从更多的纯代码开始,然后再探索Monads (和IO)。只有这样,你才能真正理解do。
https://stackoverflow.com/questions/50489871
复制相似问题