首页 文章

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

提问于
浏览
0

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

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,表示该节点存在于列表中;但如果列表中不存在haskell给我一个错误:函数buscaNodo中的非详尽模式,我需要一些帮助,我最近学习haskell并且没有自己解决问题的必要知识 . 对于我可怕的英语,我很抱歉 . 感谢你所做的一切

2 回答

  • 4

    问题正是因为 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
    

    现在你根本不用担心任何情况 .

  • 5

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

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

相关问题