Совместное использование List.exists, List.for_all и List.filter в OCaml - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь отфильтровать список пользовательских типов по содержимому списка в этих типах, и мне было интересно, есть ли способ использовать List.filter, List.exists и List.for_all для достиженияэтот внутренний список вместо создания функции для его достижения.

type weight = int
type height = int 
type colours = Red | Black | Orange | White
type cat = Cat of weight * height * colours list

let cat1 = Cat (14, 14, [Red; Black])
let cat2 = Cat (15, 20, [Black; White])
let cat3 = Cat (13, 15, [Red; White])
let cats =  [cat1; cat2; cat3]

Есть ли способ создать список кошек, которые не определенного цвета, используя только эти функции списка?Это домашнее задание, поэтому я не могу включить свой код, но я добавил функцию для выделения списка цветов в типе, а затем сравнил эти списки

Спасибо!

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете соответствовать шаблону функции, примененной к фильтру.Чтобы найти всех кошек, которые не являются черными или имеют вес <14, вы можете использовать: </p>

utop # List.filter (function Cat (_,_,cat_colors) ->
                             List.for_all (fun x -> x != Black)
                             cat_colors ) cats ;;
- : cat list = [Cat (13, 15, [Red; White])]


utop # List.filter (function Cat (weight,_,_) -> weight < 14) cats ;;
- : cat list = [Cat (13, 15, [Red; White])]

Остальное должно быть выполнимо с двумя приложениями List.for_all (в качестве логической формулы: ∀c1: colors ∀c2: cat_cols. c1 ≠ c2).Наведите указатель мыши на блок спойлера, чтобы увидеть полное решение:

...