我正在尝试编写一个函数,它可以让我知道列表中每个区域之间的距离。该函数distance
将两个区域之间的距离作为Int
一个集合数组提供给我,我想遍历整个列表以总结每个区域与其在列表中的追随者之间的距离。
但我得到了
非穷举模式
错误信息。我忽略了什么?该功能distance
正在正常工作。
lengthr :: [district] -> Int
lengthr [] = 0
lengthr (a:b:as) = (distance a b) + lengthr (b:as)
我正在尝试编写一个函数,它可以让我知道列表中每个区域之间的距离。该函数distance
将两个区域之间的距离作为Int
一个集合数组提供给我,我想遍历整个列表以总结每个区域与其在列表中的追随者之间的距离。
但我得到了
非穷举模式
错误信息。我忽略了什么?该功能distance
正在正常工作。
lengthr :: [district] -> Int
lengthr [] = 0
lengthr (a:b:as) = (distance a b) + lengthr (b:as)
我在代码中添加了这一行lengthr [a] = 0
,以掩盖只剩下一个元素的情况,现在代码按预期工作!
正如您在自己的回答中提到的那样,您错过了单个元素的情况。
_
更通用的解决方案是在您要处理的所有特定情况之后包含一个包罗万象的模式。
lengthr:: [district] -> Int
lengthr (a:b:as) = (distance a b) + lengthr (b:as)
lengthr _ = 0
这是处理默认情况的更传统方式。
在结果包含在Monad
具有错误语义的 a 中(例如Either e
和Maybe
)的情况下,您可以将默认情况设为错误,而不是潜在地忽略错误。
lengthr:: [district] -> Either String Int
lengthr (a:b:as) = do
next <- lengthr (b:as)
Right $ (distance a b) + next
lengthr [_] = Right 0
lengthr _ = Left "empty list"