Haskell:输入'|'上的解析错误

时间:2015-10-13 22:04:01

标签: haskell guard parse-error

我有以下代码,旨在从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 '|'

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

1 个答案:

答案 0 :(得分:5)

根据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关键字的相对宽度和你的缩进是,这次是你的一点点。只要您只依赖于给定行上的前导缩进并且是一致的,Hksell中的选项卡就可以了,但这意味着始终需要在{{1}之后进行换行(并进一步缩进) }},wherelet / caseof,还有可能是我忘记的其他人。 (当整个构造在一行上时,dodo除外。当然)。

相关问题