Ответ 1
Пусть прочитайте вид назад, в логическом порядке.
Скажем, что у вас есть конечный набор целых чисел: 0, 1, 2, 3, 5, 8
например
Одним из способов описания этого набора целых чисел является функция (ее характеристика или функция индикатора), которая для каждого целого возвращает true, если целое число находится в наборе, false, если это не так.
Подпись для этой функции, как мы ее описали, всегда должна быть Int => Bool
( "дать мне целое число, я скажу вам, если оно в наборе" ), в то время как его реализация будет зависеть от конкретного набора.
Для набора в моем примере выше вы можете написать эту функцию просто как:
val mySet: Int => Boolean = x => Array(0,1,2,3,5,8) contains x
или признать, что ints в наборе являются первыми из последовательности Фибоначчи и определяют f немного более сложным способом (чего я не буду делать здесь...). Обратите внимание, что "contains", который я использовал, определен для всех коллекций scala. В любом случае, теперь у вас есть функция, которая сообщает вам, что находится в наборе, а что нет. Попробуйте попробовать в REPL.
scala> val mySet: Int => Boolean = x => Array(0,1,2,3,5,8) contains x
mySet: Int => Boolean = <function1>
scala> mySet(3)
res0: Boolean = true
scala> mySet(9)
res1: Boolean = false
Теперь mySet имеет тип Int => Boolean
, который мы можем сделать более читаемым, если мы определим его как псевдоним типа.
scala> type Set = Int => Boolean
defined type alias Set
Помимо читаемости, определение Set
в качестве псевдонима Int => Boolean
делает его явным, так что Set является его характеристической функцией. Мы можем переопределить mySet более кратким (но иным образом эквивалентным) способом с псевдонимом типа Set
:
scala> val mySet: Set = x => Array(0,1,2,3,5,8) contains x
mySet: Int => Boolean = <function1>
Теперь для последней части этого длинного ответа. Пусть определим характеристическую функцию для описания этого синглтонного набора: 3
.
Легко:
val Singleton3 : Set = set => set == 3
для набора Singleton, содержащего только 4, это будет:
val Singleton4 : Set = set => set == 4
Итак, позвольте обобщить создание этих функций и написать метод, который возвращает функцию Singleton, которая для любого целого описывает набор, содержащий только это целое число:
def singletonSet(elem: Int): Set = set => set == elem
ПРИЛОЖЕНИЕ:
Я пропустил эту часть, потому что она не нужна: def contains(set: Set, elem: Int): Boolean = set(elem)
Я думаю, что это бесполезно и (без дополнительного контекста), это выглядит как надуманный пример, демонстрирующий, как вы можете передавать функцию в качестве аргумента, как и любой другой тип в scala. Он принимает функцию Int => Bool
и Int
и просто применяет эту функцию к Int
, чтобы вы могли сделать
scala> contains(mySet, 3)
res2: Boolean = true
который похож на вызов mySet(3)
.