list - F# 列表比较
问题描述
我正在寻求帮助以解决 F# 中的编程练习。我必须创建一个列表,其中列出了书籍和电影。所有与电影同名的书籍都应该列在另一个列表中。我将我到目前为止所做的事情与输入内容以及我应该得到的结果联系起来。先感谢您。
type Movie =
{ movieName: string
duration: Nat
fileSize: Nat }
type Book =
{ bookName: string
pages: Nat }
type Activity =
| Watch of Movie
| Read of Book
let booksWithMovie(activities: Activity list): Book list =
match activities with
| [] -> []
| [Read book] -> match activities with
| x :: xs -> match x with
| Watch same -> if (same.bookName = same.movieName) then [same] else
booksWithMovie(xs)
以下是输入:
Set.ofList (booksWithMovie [
Read { bookName = "The Hobbit"; pages = 304N }
Watch { movieName = "The Fellowship of the Ring"; duration = 228N; fileSize = 50N }
Read { bookName = "The Name of the Wind"; pages = 662N }
Watch { movieName = "The Emoji Movie"; duration = 86N; fileSize = 1024N }
Watch { movieName = "The Hobbit"; duration = 164N; fileSize = 9001N }
Read { bookName = "The Fellowship of the Ring"; pages = 700N }
这就是我应该得到的结果:
Set.ofList [
{ bookName = "The Hobbit"; pages = 304N }
{ bookName = "The Fellowship of the Ring"; pages = 700N }
解决方案
由于这看起来像是一个学习练习,而不是一个实际问题(如果我错了,请纠正我),我会尝试给你一个提示,以便你自己找到解决方案,而不仅仅是给出解决方案。
正如您在评论中提到的,您想遍历每本书的所有电影(以检查是否存在具有相同标题的电影)。这是一个很好的计划。实现它的最好方法是使用两个递归函数——一个遍历书籍,另一个遍历电影(寻找具有特定标题的电影)。
代码的结构应该是这样的:
let rec movieWithTitleExists title (activities:Activity list) =
match activities with
| [] -> false
| Watch movie :: xs when movie.movieName = title -> (...)
| x :: xs -> (...)
let rec booksWithMovie (activities: Activity list): Book list =
match activities with
| [] -> []
| Book book :: xs when movieWithTitleExists book.bookName -> (...)
| x :: xs -> (...)
我遗漏了一些东西,这样你仍然可以从完成练习中学到一些东西。但是,我希望语法示例有所帮助!在movieWithTitleExists
中,我们正在寻找具有指定标题的电影。在booksWithMovie
中,我们正在寻找书名也是电影名称的书。
填写应该(...)
更movieWithTitleExists
容易 - 您想要返回一个布尔值,因此您需要返回一个常量或进行递归调用。
在booksWithMovie
中,您想要返回书籍列表,因此您需要递归调用该函数,然后仅返回该函数,或者使用::
运算符将当前书籍附加到前面。
推荐阅读
- c++ - 在 C++ 中具有多线程的 OpenCV
- android - 加快 FFmpeg 处理时间
- android - 将单选按钮的文本放在其中
- python - 我正在尝试使用来自覆盆子的 IP 地址在 Windows Server 12 上编写 .txt
- postgresql - Postgresql 限制 pg_catalog 和信息架构(过程源、表列)不起作用
- apache-kafka - producer config 的 request.timeout.ms 和 broker config 的 request.timeout.ms 是怎么一起玩的
- aerospike - Aerospike - 客户端上的命令执行超时
- git - 在 git rebase 中以交互方式删除选择进行编辑的提交
- jquery - 使用 SVG 图像蒙版重新创建视差缩放效果
- angular - NGRX 如何获得以前的状态?