我有一个存储在文本文件中的元组列表。
[(1,"123","Shiva","address #1",77000),(2,"123","Sina","address #2", 1900)]
每个tuple
的第一个元素是acount_Id
,每个tuple
的第二个元素是password
,在应用程序中我倾向于从文件中读取列表询问用户的帐户号码和密码,并在文件中查找。我试过这个:
x <- readFile "database.txt"
y <- tuples x
let account = [(a,b)|(a,b,c,d,e) <- y, ac_no ==a , pass == b]
tuples
是一个函数,它接受一个字符串并输出IO [(AccNo,Pass,Name,Address,Balance)]数据类型
任何想法如何通过使用更高阶函数而不是列表处理来改进此过程?
提前致谢!
答案 0 :(得分:4)
有一个函数lookup
,它有类型签名:
lookup :: Eq a => a -> [(a, b)] -> Maybe b
但这仅限于成对。
一种选择是使用类型专门来实现这种安排。
data UserDetails = UserDetails {
password :: String
address :: String
}
并将您的列表定义为(String,UserDetails)
对,然后您就可以使用lookup
功能。将数据放入类型(而不仅仅是大量的字符串)通常是一件非常好的事情,所以我认为这样做会很好。
如果您确实想要使用更高阶的函数,请查看find
,它将返回与模式匹配的列表中的第一个。
像
这样的东西type UserDataAssociation = (String,String,String,String,String)
findMatchingAssociations :: [UserDataAssociation] -> String -> Maybe UserDataAssociation
findMatchingAssociations xs password = find (\(pw,a) -> pw == password) xs