我有以下代码,旨在从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 '|'
有人知道如何解决这个问题吗?
答案 0 :(得分:5)
制表位相隔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}之后进行换行(并进一步缩进) }},where
,let
/ case
,of
,还有可能是我忘记的其他人。 (当整个构造在一行上时,do
和do
除外。当然)。