首页 > 解决方案 > 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 }

标签: listmergesplitf#divide

解决方案


由于这看起来像是一个学习练习,而不是一个实际问题(如果我错了,请纠正我),我会尝试给你一个提示,以便你自己找到解决方案,而不仅仅是给出解决方案。

正如您在评论中提到的,您想遍历每本书的所有电影(以检查是否存在具有相同标题的电影)。这是一个很好的计划。实现它的最好方法是使用两个递归函数——一个遍历书籍,另一个遍历电影(寻找具有特定标题的电影)。

代码的结构应该是这样的:

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中,您想要返回书籍列表,因此您需要递归调用该函数,然后仅返回该函数,或者使用::运算符将​​当前书籍附加到前面。


推荐阅读