我有一个问题,就是检查列表中是否有这个名字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
答案 0 :(得分:2)
您收到错误是因为您的函数checkIfElem
期望db
为String
,而是接收元组(或三元组)列表。
这是你的代码重新格式化了一下:
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
将为您解决该问题,并且您的函数应该按照您的预期工作。