Справка по присваиванию: соединение между наборами
Я использую функциональное программирование Coursera в классе Scala. Это вторая неделя, и я ударил стену. В задании мы работаем с Sets, но не с тем набором, который мы все встречаем в Java, например. Это Set, который возвращает true, если значение там, и false в противном случае. Они говорят, что это не контейнер, это просто функция.
Чтобы понять это, мне нужна ваша помощь. Я не хочу, чтобы вы решали мое задание, это просто пример того, что я хочу получить представление о том, что я должен делать.
/**
* We represent a set by its characteristic function, i.e.
* its `contains` predicate.
*/
type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)
/**
* Returns the set of the one given element.
*/
def singletonSet(elem: Int): Set = Set(elem)
/**
* Returns the union of the two given sets,
* the sets of all elements that are in either `s` or `t`.
*/
def union(s: Set, t: Set): Set = ???
Это код. В singletonSet
я предполагаю, что способ решить это - вернуть Set(elem)
, правильно?
Если это хорошо, как я должен сделать союз между ними? Я не новичок в программировании, но я не вижу никакого способа сделать это. Так как я не должен возвращать "набор" чисел.
Вот что сказал мне еще один студент: "Но все" Set "- это функция, которая принимает Int и возвращает логическое значение (Int = > Boolean). Любая функция, которая принимает Int и возвращает логические подстановки тип" Установить".
То, что я пробовал в функции union, должно иметь что-то вроде:
def union(s: Set, t: Set): Set = (s | t) //value | not a member of Int => Boolean
Любая помощь будет оценена:)
Ответы
Ответ 1
Кажется, стена, которую вы нажимаете, - это то, что вы не знакомы с определением функций в Scala. В этом конкретном случае вам нужно определить функции типа Int => Boolean
, они берут Int
и возвращают a Boolean
.
Вот несколько примеров функциональных литералов типа Int => Boolean
. Попробуйте их в консоли Scala или в таблице Scala IDE:
(x: Int) => true
(x: Int) => false
(x: Int) => x == 2
(x: Int) => x == 10
(x: Int) => x == 2 || x == 10
(x: Int) => x % 2 == 0
Затем все, что вам нужно сделать для назначения, - использовать тот же синтаксис, начиная с (x: Int) =>
, а затем перевести значение union, intersect,... в правую часть выражения.
Часть обучения дает ему настоящие усилия. Я считаю, что вы можете повторно отправить решение несколько раз, поэтому не стесняйтесь отправлять и повторять, если вы не получите 10/10 с первой попытки. Все, что вам нужно, это компиляция кода. Удачи!
Ответ 2
Возможный намек - посмотреть на типы. Посмотрите на тип Set
. На самом деле это псевдоним типа с функцией Int
на Boolean
.
Таким образом, если у вас есть два набора, у вас есть две функции. Как вы можете использовать их для предоставления функции, представляющей объединение этих Set? Это должна быть ваша отправная точка.