我试图创建一个函数来验证列表中是否存在节点(我正在使用图表):
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并且没有自己解决问题的必要知识。对于我可怕的英语,我感到非常抱歉。谢谢大家
答案 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
功能有两种情况。一个是第二个参数是空字符串。另一种是当第一个参数是非空列表时。
但是当第一个参数是空列表而第二个参数是非空字符串时呢?当第一个参数为空且第二个参数为非空时调用该函数时,两个定义都不适合。因此,您会得到非详尽的模式错误。