F # разделить списки - PullRequest
       13

F # разделить списки

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

Я изучаю новый язык программирования, который является F #, и я изо всех сил пытаюсь найти метод.Мне нужно разделить список фильмов и книг на 2 списка.Один, где фильмы, а другой, где книги перечислены. Я не могу использовать функции, которые уже существуют в F #.Я привожу некоторые примеры того, что я сделал до сих пор.Заранее спасибо

type Movie =
{ movieName: string
  duration: Nat
  fileSize: Nat }

type Book =
    { bookName: string
      pages: Nat }

type Activity =
    | Watch of Movie
    | Read of Book

let rec partitionActivities(activities: Activity list): (Book list * Movie list) = 
  match activities with
  | [] -> [],[]
  | x::_ -> match x with
    | Read Book -> [Book],[]
    | Watch Movie -> [],[Movie]
  | _::xs -> partitionActivities(xs)

Каковы мои входные данные:

partitionActivities [
                    Read { bookName = "A"; pages = 45N }
                    Watch { movieName = "B"; duration = 120N; fileSize = 50N }
                    Read { bookName = "C"; pages = 700N }
                    Watch { movieName = "D"; duration = 100N; fileSize = 1024N }
                    Watch { movieName = "E"; duration = 150N; fileSize = 9001N }
                    Read { bookName = "F"; pages = 700N }

Какой результат должен быть:

[
                    { bookName = "A"; pages = 45N }
                    { bookName = "C"; pages = 700N }
                    { bookName = "F"; pages = 700N }
                ], [
                    { movieName = "B"; duration = 120N; fileSize = 50N }
                    { movieName = "D"; duration = 100N; fileSize = 1024N }
                    { movieName = "E"; duration = 150N; fileSize = 9001N }
                ]

1 Ответ

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

Это правильная идея.Рекурсировать с хвостом списка (xs), взять текущий Activity, определить, включает ли он Movie или Book, добавить его в начало соответствующего списка и вернуть оба списка:

let rec partitionActivities(activities: Activity list): (Book list * Movie list) = 
  match activities with
  | [] -> [], []
  | x::xs -> 
    let books, movies = partitionActivities(xs)
    match x with
    | Read book -> book::books, movies
    | Watch movie -> books, movie::movies
...