Haskell错误:函数中的非详尽模式

时间:2014-07-15 02:13:46

标签: haskell

我试图创建一个函数来验证列表中是否存在节点(我正在使用图表):

buscaNodo :: [(Nodo,Peso)]->Nodo->Bool
buscaNodo _[] = False
buscaNodo ((a,b):ar) n 
        |(n == a)= True || (buscaNodo ar n)
        |(n /= a)= False || (buscaNodo ar n)
        |otherwise = False 

该函数返回一个true,表示该节点存在于列表中;但如果它没有存在于列表中,则表示我有错误:函数buscaNodo中的非详尽模式,我需要一些帮助,我最近在学习haskell并且没有自己解决问题的必要知识。对于我可怕的英语,我感到非常抱歉。谢谢大家

2 个答案:

答案 0 :(得分:5)

问题正是因为type Nodo = String的定义。由于String本身是Char的列表,这意味着当您拥有模式时

buscaNodo _ [] = False

这相当于

buscaNodo _ "" = False

你实际上匹配空字符串。您可能想要的是切换这些参数:

buscaNodo [] _ = False

在空列表中查找任何元素(_)时,将始终返回False

您还可以使用Haskell附带的内置函数来大大简化此定义:

buscaNodo :: [(Nodo, Peso)] -> Nodo -> Bool
buscaNodo graph node = elem node $ map fst graph

现在你根本不必担心任何案件。

答案 1 :(得分:4)

您的buscaNodo功能有两种情况。一个是第二个参数是空字符串。另一种是当第一个参数是非空列表时。

但是当第一个参数是空列表而第二个参数是非空字符串时呢?当第一个参数为空且第二个参数为非空时调用该函数时,两个定义都不适合。因此,您会得到非详尽的模式错误。