1

我有一个存储在文本文件中的元组列表。

[(1,"123","Shiva","address #1",77000),(2,"123","Sina","address #2", 1900)]

每个元素的第一个元素是,每个tuple元素acount_Id的第二个元素tuplepassword,在应用程序中,我倾向于从文件中读取列表,向用户询问帐号和密码,然后在文件中查找。我试过这个:

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)] 数据类型的输出

知道如何通过使用高阶函数而不是列表处理来改进这个过程吗?

提前致谢!

4

1 回答 1

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
于 2013-01-24T12:49:00.583 回答