Сравнение списка F # - PullRequest
       19

Сравнение списка F #

0 голосов
/ 26 ноября 2018

Прошу помощи в решении упражнения по программированию на 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 }

1 Ответ

0 голосов
/ 26 ноября 2018

Поскольку это похоже на учебное упражнение, а не на реальную проблему (исправьте меня, если я ошибаюсь), я постараюсь дать вам подсказку, чтобы вы могли найти решение самостоятельно, а не просто дать решение.

Как вы упомянули в комментариях, вы хотели перебрать все фильмы для каждой книги (чтобы проверить, существует ли фильм с таким же названием).Это хороший план.Лучший способ реализовать это - использовать две рекурсивные функции - одну для просмотра книг и другую для просмотра фильмов (в поисках фильма с определенным названием).

Структура кода должна выглядеть примерно такэто:

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 вы хотите вернуть список книг, поэтому вам нужно будет вызвать функцию рекурсивно, а затем либо просто вернуть ее, либо добавитьтекущую книгу вперед, используя оператор ::.

...