首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“输入时出现解析错误”,包含案例分析

“输入时出现解析错误”,包含案例分析
EN

Stack Overflow用户
提问于 2018-05-23 21:36:01
回答 1查看 283关注 0票数 0

我有下面的主函数,它应该向两个玩家询问他们的棋盘,这些棋盘是从另一个文件中的棋盘库中选择的,然后用这些输入运行一个循环。

代码语言:javascript
复制
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
      }

代码在代码行的分号上出现解析错误:

代码语言:javascript
复制
 "deck1" -> let {d1 = deck1};
 "deck1" -> let {d2 = deck1};

我已经盯着这个看了很久了,我相信这是很简单的事情,但我希望能有一双新的眼睛来看看哪里出了问题。:)

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 03:14:17

Haskell的letdo块中的行为与在do块之外的行为不同。由于语法为let in,因此语句let {d2 = deck 1};的格式不正确。要解决这个问题,您可以将其包装在一个do中(例如:do let {d2 = deck1};),这应该可以解决解析错误,但这并不是您想要的。

OP中的代码有如此多的错误,以至于我不确定从哪里开始,但这里有一些提示:

  • 什么是Deck1/2?
  • d1/2的类型是什么?最初,它是一个字符串,因为您用getLine填充它,但随后将它赋值给deck1,这可能不是do外部的getLine表示法必须跟在let BINDING in VALUE之后。let BINDING不是一个值,它本身没有任何意义。此外,let BINDING in VALUE仅在值中应用绑定。dolet的特别之处在于它将绑定应用于它后面的所有行,但该绑定没有被覆盖。(例如: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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50489871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档