【问题标题】:Haskell: parse error on input '|'Haskell:输入“|”时解析错误
【发布时间】:2016-01-11 20:08:11
【问题描述】:

我有以下代码,旨在从m 中获取一个双份,并将以s 开头的双份替换为表达式e 的评估

exec (Assign s e) m = assign s (eval e m) m
where assign _ _ [] = error ("undef var " ++ s)
    assign s v (x:xs)
        | fst x == s = if sameKind v (fst x)
                        then (fst x,v):xs
                        else error "type error in assign"
        | otherwise = x:(assign s v xs)
            where sameKind (VInt a) (VInt b) = True
                sameKind (VBool a) (VBool b) = True
                sameKind _ _ = False

编译时出现错误:parse error on input '|'

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您似乎在使用制表符缩进。使用空间,它有更高的工作机会。 (如果要使用制表符,则必须将内容拆分为多行。制表符也不利于对齐。)
  • 将制表符替换为空格,现在第三行的输入“分配”出现解析错误。所以我想那将是一个新问题。
  • 你所有的assigns 必须相互对齐,sameKinds 也是如此。
  • 你的第一个where(在exec下)应该缩进更多。
  • 那个是缩进的,一定是在复制粘贴的过程中发生了什么事。无论如何,我对齐它并且效果很好。谢谢!

标签: haskell guard parse-error


【解决方案1】:

根据Haskell 98 report

制表位相隔 8 个字符。

您的代码似乎是为 5 个(?)空格制表符设计的;更改编辑器的选项卡设置或停止使用选项卡,问题就会消失。

原因是:Haskell 认为你是这样缩进的:

where assign _ _ [] = error ("undef var " ++ s)
        assign s v (x:xs)

如您所见,这意味着第二个定义的开头仍在第一个定义的 RHS 内。

还有:

不要这样做:

where f [] = one_expr
      f (x:xn) = another_expr

因为它很难选择 where 关键字和第一个等式彼此分开,而且因为这意味着你取决于 Haskell 认为 where 关键字的相对宽度和你的缩进是什么,这就是这次咬你的原因。只要您只依赖给定行上的前导缩进并且保持一致,Haskell 中的制表符就可以了,但这意味着您总是需要在where 之后有一个换行符(并进一步缩进) ,letcase/ofdo,可能还有其他我忘记了。 (当然,除了dolet,当整个结构在一行时)。

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2014-02-07
    相关资源
    最近更新 更多