【发布时间】:2015-03-10 15:06:11
【问题描述】:
我有以下创建数据库的代码...
type Title = String
type Singer = [String]
type Year = Int
type Fan = String
type Fans = [Fan]
type Film = (Title, Actor, Year, Fans)
type Database = [Film]
filmDatabase :: Database
filmDatabase = [("Wrapped up", ["Olly Murs"], 2014, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
("Someone Like you", ["Adele"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),
然后我使用以下代码搜索 A 粉丝并显示他们喜欢的所有音乐。
fanOfFilms :: Fan -> Film -> Bool
fanOfFilms fan (t, _, _, f)
|elem fan f = True
|otherwise = False
givenUser :: Fan ->[Film]
givenUser fan = filter (fanOfFilms fan) testDatabase
我现在想使用此代码并使其仅显示标题。我该怎么做呢?我尝试过使用 map 并尝试使用模式匹配但无法让它工作?!
我试过的代码
titleOnly :: (t, a, y, f) -> (t, f)
titleOnly (t, _, _, f) = (t, f)`
然后我尝试将其链接到 FansFilms,但它看起来很乱,我不知道如何正确
【问题讨论】:
-
好吧,我尝试编写一个函数:
titleOnly :: (t, a, y, f) -> (t, f) titleOnly (t, _, _, f) -> (t, f),然后我尝试使用 titleOnly 调用 givenUser 所以它只打印标题和风扇,但这没有用 -
很抱歉现在这样做了@bheklilr
-
我建议使用实际的类型别名而不是你所拥有的。试试
filmTitle :: Film -> Title;filmTitle (t, _, _, _) = t。这基本上就是你所拥有的,我更改了函数名称,它只是获得了一部电影的标题。您可以通过模式匹配非常相似地定义filmActor、filmYear和filmFans。如果您想同时获取数据库中所有电影的标题和粉丝,则可以将filmTitle和filmFans组合成一个新函数,但这通常使用 lambda 来完成,例如map (\f -> (filmTitle f, filmFans f)) filmDatabase. -
好的,我知道你做了什么只得到电影名称,但是我如何将
filmTitle的这个函数应用到我上面使用的givenUser函数 -
您的
givenUser函数返回[Film]。尝试使用:type map (\f -> (filmTitle f, filmFans f))在 GHCi 中检查上面给你的map的类型。还要记住type Database = [Film]。