Haskell:检查列表中的名称

时间:2017-04-27 16:06:06

标签: haskell

我有一个问题,就是检查列表中是否有这个名字haskell。我已经编写了这个程序,但当我检查它有效时,但是当我检查没有任何答案时。如果有人可以帮助我?

db = [("David","worksfor", "IBM")
 ,("Alan","takeinterhipin", "Microsoft")
checkIfElem :: String -> [String] -> Bool
checkIfElem "David" db = if "David" `elem` db 
                         then True
                       else False 

错误如下图所示: enter image description here

1 个答案:

答案 0 :(得分:2)

您收到错误是因为您的函数checkIfElem期望dbString,而是接收元组(或三元组)列表。

这是你的代码重新格式化了一下:

db = [ ("David","worksfor", "IBM")
     , ("Alan","takeinterhipin", "Microsoft")
     ]
checkIfElem :: String -> [String] -> Bool
checkIfElem "David" db =
    if "David" `elem` db then True else False

由于("David", "worksfor", "IBM")的类型为(String, String, String),因此您的代码不会进行类型检查。您可以通过引入一个函数来解决此问题,以提取此类型的名称部分,这只是一个字符串。这是使用此功能的代码:

db = [ ("David","worksfor", "IBM")
     , ("Alan","takeinterhipin", "Microsoft")
     ]
checkIfElem :: String -> [(String, String, String)] -> Bool
checkIfElem "David" db =
    if "David" `elem` (map getName db) then True else False

getName :: (String, String, String) -> String
getName (name, _, _) = name

注意getName函数,取一个元组并返回String。要使用此功能,我们还必须更新checkIfElem的类型。获取db类型的元组列表(函数的第二个参数)。

现在可以使用“David”运行您的功能,如您所见:

*Main> checkIfElem "David" db
True

但这仍然不正确,因为任何其他名称都会导致运行时错误:

*Main> checkIfElem "Jim" db
*** Exception: foo.hs:(7,1)-(8,59): Non-exhaustive patterns in function checkIfElem

这是因为你是“David”的模式匹配作为第一个参数。您尚未为任何其他值定义函数。毕竟,在调用函数时会传递名称,因此您不需要在函数本身的定义中包含“David”。

将字符串"David"替换为函数定义中的一些低级变量名称,例如name将为您解决该问题,并且您的函数应该按照您的预期工作。