В курсе Стэнфорда Scala я столкнулся с следующим назначением:
Упражнение 1 - Наборы как функции:
В этом упражнении мы будем представлять множества как функции от Ints до Booleans:
type Set = Int => Boolean
a) Напишите функцию "set", которая принимает параметр Int и возвращает набор, содержащий этот Int.
b) Напишите функцию "содержит", которая принимает параметры Set и Int как параметры и возвращает true, если Int в Set и false в противном случае.
c) Напишите функции "union", "intersect" и "минус", которые берут два набора в качестве параметров и возвращают Set.
d) Можете ли вы написать функцию "подмножество", которая принимает два набора в качестве параметров и возвращает true, если первый является подмножеством второго и false в противном случае?
Решения для a, b и c довольно тривиальны:
def set(i: Int): Set = n => n == i
def contains(s: Set, i: Int) = s(i)
def union(a: Set, b: Set): Set = i => a(i) || b(i)
def intersect(a: Set, b: Set): Set = i => a(i) && b(i)
def minus(a: Set, b: Set): Set = i => a(i) && !b(i)
Но есть ли элегантное решение для d? Конечно, строго говоря, ответ d - "да", так как я могу написать что-то вроде:
def subset(a: Set, b: Set) = Int.MinValue to Int.MaxValue filter(a) forall(b)
но это, вероятно, не правильный путь.