我如何使用警卫:在输入'|'上解析错误

时间:2016-09-18 18:24:55

标签: haskell syntax-error

编辑:这是一个老问题,StackOverflow不会让我删除。当时我不明白守卫何时适当,所选答案给出了很好的描述。

我正在尝试在Haskell中编写一个程序,它接受一个数字列表并返回最大连续子序列的值。

我收到了第7行的编译错误,这是第一个警卫的行。

1

为什么守卫不是有效的语法?我的目的是让newSofar和newRestOfList的定义可用于有警卫的三条线。

1 个答案:

答案 0 :(得分:4)

粗略地说,=的左侧使用了警卫,如

f x y
   | cond1 x y = ...
   | cond2 x y = ...
   | otherwise = ...

在您的代码中,只需删除| - 您不需要警卫。 if就足够了。

此外,使用if null, head, tail是一致的,因为存在更好的替代方案。请记住,head,tail会在您忘记null检查的那一天崩溃您的计划。由于模式匹配没有这个问题,因此在可能的情况下非常优先。

maxsubseqRecurse sofar [] = sofar
maxsubseqRecurse sofar (h:newRestOfList) =
    if newSofar < 0
    then maxsubseqRecurse 0     newRestOfList
    else maxsubseqRecurse sofar newRestOfList
       where
       newSofar = sofar + h

重新引入警卫,我们获得:

maxsubseqRecurse sofar [] = sofar
maxsubseqRecurse sofar (h:newRestOfList)
   | newSofar < 0 = maxsubseqRecurse 0     newRestOfList
   | otherwise    = maxsubseqRecurse sofar newRestOfList
   where
   newSofar = sofar + h