F # Список разделить, разделить - PullRequest
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 rec createActivities(hl: (string * Nat * Nat) list): Activity list = 
    match hl with
      | [] -> []
      | x::xs -> ....

Вот входные данные:

createActivities([
                "The Hobbit"                , 304N, 0N
                "The Fellowship of the Ring", 228N, 50N
                "The Name of the Wind"      , 662N, 0N
                "The Emoji Movie"           , 86N , 1024N
                "The Hobbit"                , 164N, 9001N
                "The Fellowship of the Ring", 700N, 0N

Результат:

[
                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 }
            ]

Ответы [ 2 ]

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

Я мог бы решить проблему следующим образом.Спасибо за помощь.

let rec createActivities(hl: (string * Nat * Nat) list): Activity list =    
  match hl with 
  | [] -> []
  | (name, pagesorduration, Size) :: xs -> 
    if Size = 0N then Read { bookName = name; pages = pagesorduration } :: createActivities(xs) 
    else Watch { movieName = name; duration = pagesorduration; fileSize = Size } :: createActivities xs
0 голосов
/ 26 ноября 2018

Выражения соответствия в F # могут быть довольно сложными, с подсовпадениями в различных частях выражения соответствия.Например, регистр x::xs в выражении соответствия можно преобразовать в (name, duration, filesize) :: xs.И если вы укажете значение для одного из них, оно будет совпадать только тогда, когда эта часть кортежа будет иметь это значение.Имея это в виду, я бы написал ваше выражение соответствия как-то так:

let rec createActivities(hl: (string * Nat * Nat) list): Activity list = 
    match hl with
      | [] -> []
      | (name, pages, 0N) :: xs -> Read { bookName = name; pages = pages } :: createActivities xs
      | (name, duration, fileSize) :: xs -> Watch { movieName = name; duration = duration; fileSize = fileSize } :: createActivities xs

Как это работает, так что случаи match будут обрабатываться в порядке сверху вниз, а первоеэти совпадения будут использованы.Таким образом, если кортеж как 0N в качестве его третьего элемента, будет использоваться второй случай совпадения, в противном случае будет использован третий случай совпадения.Таким образом, выражение соответствия может быть довольно простым и чистым.

...