很简单,你可以写一个自定义的查找功能:
lookupBy :: Eq b => (a -> b) -> [a] -> b -> Maybe a
lookupBy _ [] _ = Nothing
lookupBy f (x:xs) key = if f x == key then Just x else lookupBy f xs key
然后,你可以使用它作为
main = do
let people = [Person "John" "Doe" 68 30, Person "Jane" "Smith" 63 28]
print $ lookupBy firstName people "Jane"
print $ lookupBy lastName people "Doe"
print $ lookupBy age people 29
print $ lookupBy height people 63
这将打印
Just (Person {firstName="Jane", lastName="Smith", height=63, age=28})
Just (Person {firstname="John", lastName="Doe", height=58, age=30})
Nothing
Just (Person {firstName="Jane", lastName="Smith", height=63, age=28})
(假设它编译,我没有运行这个代码,但它应该工作)。
如果你想你是否得到一个单一的项目或匹配的项目列表中进行选择,你可以做
import Data.Maybe (listToMaybe)
lookupAllBy :: Eq b => (a -> b) -> [a] -> b -> [a]
lookupAllBy f xs key = filter (\x -> f x == key) xs
lookupBy :: Eq b => (a -> b) -> [a] -> b -> Maybe a
lookupBy f xs key = listToMaybe $ lookupAllBy f xs key
如果你只在第一场比赛有兴趣,你可以用' Data.Maybe.listToMaybe'在被过滤的列表上。 – raymonad
...或者你可以使用'Data.List.find'。 – kosmikus