编辑:这是一个老问题,StackOverflow不会让我删除。当时我不明白守卫何时适当,所选答案给出了很好的描述。
我正在尝试在Haskell中编写一个程序,它接受一个数字列表并返回最大连续子序列的值。
我收到了第7行的编译错误,这是第一个警卫的行。
1
为什么守卫不是有效的语法?我的目的是让newSofar和newRestOfList的定义可用于有警卫的三条线。
答案 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