【问题标题】:SPOJ's "Life, the Universe, and Everything" in Haskell - `if' parse errorHaskell 中 SPOJ 的“生命、宇宙和一切” - `if' 解析错误
【发布时间】:2014-04-02 12:57:37
【问题描述】:

我是 Haskell 的初学者,想开始用它解决问题,所以我尝试解决第一个 SPOJ 问题(问题代码:TEST)。 “问题”是读取行并打印它们,直到出现“42”。

main = do input <- getLine
          if input == "42" then putStr "" 
          else do putStrLn input
                  main

我的解决方案非常简单,但输入“if”时出现解析错误。当我在开头和 else 语句中将“main”更改为“main2”时,一切正常。为什么'if'会出现解析错误?

【问题讨论】:

  • 你的代码在我尝试时编译得很好。你确定它的缩进和你在这里写的一样吗? do 块对缩进敏感。
  • 是的,就像我写的一样……你没有得到那个解析错误吗?

标签: haskell if-statement io parse-error


【解决方案1】:

您的编辑器混合了制表符和空格,当您的编辑器将制表符显示为 4 个空格时,Haskell 将制表符解释为 8 个字符。

请注意,您不能在 StackOverflow 上以普通代码块重现您的代码,因为 StackOverflow 会自动将制表符替换为空格。自己尝试 - 将问题中的代码复制到编辑器中,假设它不会自动将开头的空格转换为制表符。

所以在你的编辑器中禁用标签并将现有的标签转换为四个空格,你应该没问题。

【讨论】:

    【解决方案2】:

    尝试在右侧缩进“else”而不是“if”。现在不再需要(IIRC),但早期的编译器需要这样做。原因是在 do 块中,您的代码被解析为:

    main = do { input <- getLine ;
                if input == "42" then putStr "" ;  -- parse error, no "else"
                else do { putStrLn input ;
                          main
                        }
              }
    

    新的编译器应该允许额外的“;”在“else”之前,较旧的则没有。

    更多详情请见DoIfThenElse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多