【问题标题】:Parse error (possibly incorrect indentation or mismatched brackets) - Haskell解析错误(可能不正确的缩进或不匹配的括号) - Haskell
【发布时间】:2015-04-10 23:57:54
【问题描述】:

这很愚蠢,但我什至无法解决空格和制表符的问题。有时我认为问题不在于我,而在于 Haskell。为什么 Python 没有同样的问题?

我的代码是:

lookups :: (Eq a) => a -> [(a,b)] -> [b]
lookups x ys = do y <- ys
                  if fst y == x then return (snd y)

我有一个错误:parse error (possibly incorrect indentation or mismatched brackets)。我的代码只使用空格。

【问题讨论】:

  • 至于“用空格和制表符解决问题”——在 Haskell 中使用 always Exclusive 空格就没有问题了。除非问题实际上是其他问题,而不是缩进:就像 bheklilr 所说,实际上是关于不完整的ifthenelse
  • @leftaroundabout,是的,我总是使用空格。我的 IDE 做到了。
  • Ifthen总是后跟 else。 Haskell 不是必须的!

标签: haskell


【解决方案1】:

您的if-then 上需要一个else。 Haskell 中的所有ifs 都必须有thenelse,否则表达式不会总是返回值。在 Haskell 中,所有表达式都必须返回一个值,因此没有 elseif-then 不是表达式,因此会出现解析错误。你需要决定如果fst y /= x

lookups x ys = do y <- ys
                  if fst y == x
                    then return (snd y)
                    else ???

【讨论】:

  • @David 如果你来自另一种语言,比如 Java 或 Python,那么是的,它不是很直观,但如果你有 int func(int x) { if (x == 1) { return 2; } },你仍然会在 Java 中遇到错误,因为不是所有代码路径都返回一个int(我认为我的语法是正确的,我已经好几年没有编写Java 代码了)。在 Haskell 中,它只是不会在没有 else 的情况下进行解析,而不是抛出相当于类型错误的内容。
  • 是的,这段代码不会在Java 中编译。但是消息会给你更多的意义。此外,IDEA(最好的 Java IDE)通过帮助静态分析器告诉您错误。
猜你喜欢
  • 2014-05-05
  • 2015-01-26
  • 2018-01-21
  • 2021-01-25
  • 2022-09-28
  • 1970-01-01
  • 2017-06-06
  • 2016-09-28
  • 2021-07-02
相关资源
最近更新 更多