首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell高阶函数

Haskell高阶函数
EN

Stack Overflow用户
提问于 2013-04-20 23:04:00
回答 1查看 165关注 0票数 0

我在从这个给定的数据库输出某些信息时遇到了问题:

代码语言:javascript
复制
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代码如下所示:

代码语言:javascript
复制
filmsByFan y = map (\(a,_,_,_) -> a) $ filter (\(_,_,_,a) -> elem y a) testDatabase

这100%有效,所以我用byYear尝试了一个类似的方法:

代码语言:javascript
复制
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> elem y a) testDatabase

但是这并不是compile...Is,因为类型Year被设置为Int?如果是这样,我的问题有没有类似的解决方案?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-20 23:07:33

在第一种情况下,您希望检查粉丝列表中是否包含person y,因此是elem y a

在第二种情况下,需要检查年份y是否等于电影的年份,因此只需检查a == y是否相等

代码语言:javascript
复制
filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> a == y) testDatabase

顺便说一句,如果给lambdas命名,这段代码的可读性会更好:

代码语言:javascript
复制
title (t, _, _, _) = t
fans (_, _, _, fs) = fs
year (_, _, y, _) = y

而且使用函数链接更加惯用:

代码语言:javascript
复制
filmsByFan f = map title $ filter (elem f . fans) testDatabase
filmsByYear y = map title $ filter ((== y) . year) testDatabase

到目前为止,您可能发现了一种模式,它本身可以在高阶函数中很好地捕获:

代码语言:javascript
复制
filmsBy func = map title $ filter func testDatabase
filmsByFan f = filmsBy (elem f . fans)
filmsByYear y = filmsBy ((== y) . year)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16121795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档