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