List 列表比较

List 列表比较,list,merge,split,f#,divide,List,Merge,Split,F#,Divide,我请求帮助解决F#中的一个编程练习。我必须创建一个列表,在其中列出书籍和电影。所有与电影同名的书都应该列在另一个列表中。我将我到目前为止所做的工作与输入内容以及应该得到的结果联系起来。先谢谢你 type Movie = { movieName: string duration: Nat fileSize: Nat } type Book = { bookName: string pages: Nat } type Activity = | Watch of Movie | R

我请求帮助解决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 -> (...)
我遗漏了一些东西,这样你仍然可以从完成练习中学到一些东西。不过,我希望这个语法示例对您有所帮助!在标题为Exists的电影中,我们正在寻找具有指定标题的电影。在
booksWithMovie
中,我们正在寻找这样一本书:书名也是电影名

用titleExists填充
电影中的
(…)
应该更容易-您希望返回布尔值,因此您需要返回常量或进行递归调用


booksWithMovie
中,您希望返回书籍列表,因此需要递归调用函数,然后返回该函数,或者使用
操作符将当前书籍附加到前面。

我不确定我是否理解问题所在-您的示例结果似乎不像是将具有相同标题的书籍和电影连接在一起的东西。另外,你是想用递归从头开始写这个,还是想使用内置库?我链接了一个错误的示例结果,这是正确的。谢谢!为了能够提供帮助,如果您能够解释您解决问题的策略,也将是一件好事-您发布了一些代码示例,但这些示例甚至没有编译,也没有说明您计划如何解决问题。你能用文字描述一下你对这个问题的看法吗?(还有,不管你是想使用递归还是内置函数。)可能重复我想使用递归而没有内置函数。我的第一个计划是比较列表中的每一本书和每一部电影,并删除每一部标题不相同的书和电影。所以在最后我会有一个列表,其中只列出了作为电影存在的书籍。我不知道这是不是该走的路。谢谢,我会尽力补充你的样品。乍一看,我更了解这个练习。我想我已经知道怎么解决了。非常感谢。