我在从这个给定的数据库输出某些信息时遇到了问题:
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"])]注意:由于列表的大小,这只是数据库的一部分。
我正在尝试编写一个函数,允许用户输入年份并仅输出电影名称。我对粉丝做了类似的操作,用户输入粉丝名称并输出电影他们是粉丝的of...The代码如下所示:
filmsByFan y = map (\(a,_,_,_) -> a) $ filter (\(_,_,_,a) -> elem y a) testDatabase这100%有效,所以我用byYear尝试了一个类似的方法:
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> elem y a) testDatabase但是这并不是compile...Is,因为类型Year被设置为Int?如果是这样,我的问题有没有类似的解决方案?
提前感谢!
发布于 2013-04-20 23:07:33
在第一种情况下,您希望检查粉丝列表中是否包含person y,因此是elem y a。
在第二种情况下,需要检查年份y是否等于电影的年份,因此只需检查a == y是否相等
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> a == y) testDatabase顺便说一句,如果给lambdas命名,这段代码的可读性会更好:
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)https://stackoverflow.com/questions/16121795
复制相似问题