【问题标题】:haskell error on input else其他输入上的haskell错误
【发布时间】:2014-12-11 23:13:49
【问题描述】:

下面的代码有点麻烦。我不断收到一条错误消息“说输入'else'时出现解析错误”。我看不出我做错了什么,我有从 if 缩进的 else 语句,并且语句中的语法是正确的。一点背景,它是 2-3-4 树插入方法的一部分,专门用于插入需要将四节点(Root3)拆分为其父节点的位置。 x y 和z 是fournode 中的值,而c1 - c4 是它的子节点。在这里查看了有关这些类型错误的其他问题,但找不到任何有用的东西:(有人有什么想法吗?

insert t (Root1 a left right) | t <= a = case left of
(Root3 x y z c1 c2 c3 c4) -> if t <= y then Root2 y a (insert t (Root1 x c1 c2) (Root1 z c3 c4) right else Root2 y a (Root1 x c1 c2) (insert t (Root1 z c3 c4)) right
_ -> Root1 a (insert t(left)) (right)

【问题讨论】:

    标签: parsing haskell if-statement


    【解决方案1】:

    可能还有其他错误,但我立即可以看到您的括号不匹配.... 看看then 中的括号。在 then 子句完成之前,编译器不会期望 else,但是缺少的 end paren 会阻止这种情况发生。

    【讨论】:

    • 你能解释一下吗?我看不出这段代码中的括号有什么问题。我应该提到这只是我的插入方法的一部分,但它是不起作用的部分。代码编译得很好,没有它就可以运行,但显然结果是fournode没有正确拆分
    • 数一数你的括号,打开的次数多于关闭的次数。特别是,在then 之后,我在insert 之前看到了一个左括号,虽然后面有一些开闭括号,但这个特定的括号并没有在else 之前结束。
    • 好的,所以我添加了缺少的括号,这就是诀窍,但现在我在下一行“_ -> Root1 a (insert t(left)) (right)”和我真的看不出有什么问题吗?很确定我的逻辑至少是正确的:p
    • 您需要在case-of 中的每个项目之前放置相同的空格。这意味着(Root3 x y z c1 c2 c3 c4) -&gt;_ -&gt; 需要缩进到同一个地方,而它们不是。
    【解决方案2】:

    你的缩进混合了制表符和空格,这是一个很大的禁忌:缩进在 Haskell 中非常重要,你要确保你看到的和编译器看到的一样。仅仅因为一个制表符看起来大约有 8 个空格,并不意味着您可以放一个而不是 8 个空格。

    我建议您解决此问题以仅使用空格,确保排列正确,然后如果您仍有问题,请提出新问题。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多