В курсе Stanford Scala я встретил следующее задание:
Упражнение 1 - Наборы как функции:
В этом упражнении мы представим наборы как функции от Ints до Booleans:
type Set = Int => Boolean
a ) Напишите функцию «set», которая принимает параметр Int и возвращает набор, содержащий этот Int.
b ) Напишите функцию «содержит», которая принимает Set и Int в качестве параметров и возвращает true, если Int находится в Set, и false в противном случае.
c ) Напишите функции «union» , «пересечение» и «минус», которые принимают два набора в качестве параметров и возвращают набор.
d ) Можно ли написать функцию «подмножество», которая принимает два набора в качестве параметров и возвращает истину, если fi первый является подмножеством второго и ложно в противном случае?
Решения 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)
, но это, вероятно, неправильный путь.