Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell递归中的非穷举模式_Haskell_Recursion_Non Exhaustive Patterns - Fatal编程技术网

Haskell递归中的非穷举模式

Haskell递归中的非穷举模式,haskell,recursion,non-exhaustive-patterns,Haskell,Recursion,Non Exhaustive Patterns,我正试图写一个函数,它给出我列表中每个区域之间的距离。函数distance给出了两个区域之间的距离,作为集合数组中的Int,我想遍历整个列表,总结列表中每个区域与其跟随者之间的距离 但我得到了 非穷举模式 错误消息。我忽略了什么?功能距离正常工作 lengthr :: [district] -> Int lengthr [] = 0 lengthr (a:b:as) = (distance a b) + lengthr (b:as) 我在代码中添加了lengthr[a]=0行,以掩盖只

我正试图写一个函数,它给出我列表中每个区域之间的距离。函数distance给出了两个区域之间的距离,作为集合数组中的Int,我想遍历整个列表,总结列表中每个区域与其跟随者之间的距离

但我得到了

非穷举模式

错误消息。我忽略了什么?功能距离正常工作

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中的情况下,例如,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"

如果给lengthr一个列表,其中正好有一个元素,会发生什么情况?没有下一个目的地可去,因此距离应输出0。您在当前函数定义中看到任何行会发生这种情况吗?如果没有,您能想出一行可以添加的代码吗?将来,在使用-Wall时使用警告进行编译:您将在编译时捕获错误,错误消息将提到您缺少的案例。