我无法从这个给定的数据库中输出某些信息:
type Title = String
type Actor = String
type Cast = [Actor]
type Year = Int
type Fan = String
type Fans = [Fan]
type Period = (Year, Year)
type Film = (Title, Cast, Year, Fans)
type Database = [Film]
testDatabase :: Database
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green", "Judi Dench"], 2011, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
("Cowboys & Aliens", ["Harrison Ford", "Daniel Craig", "Olivia Wilde"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),
("Catch Me If You Can", ["Leonardo DiCaprio", "Tom Hanks"], 2006, ["Zoe", "Heidi", "Jo", "Emma", "Liz", "Sam", "Olga", "Kevin", "Tim"])]
注意:由于列表的大小,这只是数据库的一部分。
我正在尝试编写一个功能,允许用户输入一年并仅输出电影标题。我已经与粉丝做了类似的一个用户输入粉丝名称并输出电影他们是...的粉丝代码如下所示:
filmsByFan y = map (\(a,_,_,_) -> a) $ filter (\(_,_,_,a) -> elem y a) testDatabase
这是100%的工作,因此我尝试了与byYear相似的一个:
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> elem y a) testDatabase
但是这不能编译......这是因为类型Year被设置为Int吗?如果是这样,以类似的方式解决我的问题?
提前致谢!
答案 0 :(得分:2)
在第一种情况下,您要检查粉丝列表中的y
人是否 ,因此elem y a
。
在第二种情况下,您想要检查年份y
是否等于到影片的年份,因此您只需检查相等性,a == y
:< / p>
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> a == y) testDatabase
顺便提一下,如果你给lambda的名字,这段代码会更具可读性:
title (t, _, _, _) = t
fans (_, _, _, fs) = fs
year (_, _, y, _) = y
使用函数链更加惯用:
filmsByFan f = map title $ filter (elem f . fans) testDatabase
filmsByYear y = map title $ filter ((== y) . year) testDatabase
到目前为止,你可能正在发现一个模式,它本身可以在高阶函数中很好地捕获:
filmsBy func = map title $ filter func testDatabase
filmsByFan f = filmsBy (elem f . fans)
filmsByYear y = filmsBy ((== y) . year)