2013-05-11 2 views
0

Привет, я новичок в Scala и программировании в целом. Я взял курс Scala на coursera, одним из заданий было создание функций, которые принимают наборы как параметры и возвращают другой набор, который является объединением/пересечением/разностью двух наборов. Вот решение для пересечения:Как scala выведенные типы в этом примере кода?

def intersect(s: Set, t: Set): Set = elem => s(elem) && t(elem) 

Я не понимаю элем. Как Scala знает, что это элемент набора, и почему, если его пытались в shell, он возвращает ошибку: отсутствует тип параметра.

Растворы для объединения и разности (то же):

def union(s: Set, t: Set): Set = elem => s(elem) || t(elem) 

def diff(s: Set, t: Set): Set = elem => s(elem) && !t(elem) 

От Scala Set:

Общий признак для изменяемых наборов.

Набор представляет собой набор, который не содержит повторяющихся элементов.

Замечание по реализации: Эта характеристика обеспечивает большую часть операций набора независимо от его представления. Обычно он унаследован конкретными реализациями множеств.

Для реализации конкретного набора, необходимо обеспечить реализацию следующих методов:

def contains(key: A): Boolean 
def iterator: Iterator[A] 
def +(elem: A): This 
def -(elem: A): This 
+0

Посмотрите на определение 'Set', и вы должны выяснить, что такое' elem'. Кроме того, вы должны опубликовать определение 'Set', если вы хотите получить ответ (я просто знаю его, потому что я взял тот же класс). –

ответ

1

От класса лестницу в прошлом году на Coursera:

object FunSets { 
    /** 
    * We represent a set by its characteristic function, i.e. 
    * its `contains` predicate. 
    */ 
    type Set = Int => Boolean 
    // [...] 
} 

Т.е. Set не относится к предопределенному признаку scala, а к функции, которая принимает Int в качестве параметра и возвращает Boolean. Например. набор, содержащий один элемент {3}, представлен функцией f(Int), где f(3) возвращает true и f(x) с x != 3 возвращает false.

пример вы дали:

def intersect(s: Set, t: Set): Set = elem => s(elem) && t(elem) 

работает только если вы определили тип Set, как Int => Boolean раньше.

0

Параллельно можно сделать с помощью функции фильтра:

List(1,2,4,5).filter(elem => elem < 4) = List(1, 2) 

Что здесь происходит то же самое , Мы определяем переменную «elem» и определяем ее своим ограничением: s (elem) & & t (elem) для объединения.

Что касается того, почему он не работает в командной строке, я считаю, что для Set вместо «Обычный» задан «тип». Посмотрите в коде

Смежные вопросы