2016-11-27 2 views
2

Я новичок в Scala's Set. Я пытался объединить набор с пустым множеством. Код следующим образом:Пустой комплект Scala: ... не соответствует ожидаемому типу Set [Nothing]

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = { 
    preferences.foldLeft(Set.empty){(r,c) => c match { 
    case (_, li) => li.toSet ++ r 
    case _ => r 
    }} 
} 

ошибка произошла, когда я пытаюсь сделать li.toSet ++ r, жалуясь, что ... doesn't conform to expected type Set[Nothing]. Тогда я понятия не имею, как создать набор, начиная с пустого.

Спасибо всем.

+1

Что такое '' ...? – Bergi

+0

@Bergi '...' - тип, подробный тип 'Slot'. Thanks –

ответ

4

Вы должны помочь компилятору вывести правильный тип, он не имеет достаточно информации, чтобы понять, что вы имеете в виду Set[Slot], empty принимает параметр типа:

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = { 
    preferences.foldLeft(Set.empty[Slot]){(r,c) => c match { 
    case (_, li) => li.toSet ++ r 
    case _ => r 
    }} 
} 
+0

Огромное спасибо! Я только что попробовал, и это работает как шарм! :) –

2

Simpler и изящное решение

preferences.valuesIterator.flatten.toSet 

Получить все значения предпочтений пакетно valuesIterator, а затем flatten, а затем преобразовать, чтобы установить с помощью toSet функция.

getAllSlots функция становится

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = 
    preferences.valuesIterator.flatten.toSet 
+0

'valuesIterator' будет лучше, поэтому вы не создадите ненужную промежуточную коллекцию. –

+0

@AlexeyRomanov за это предложение изменил его на значенияIterator – pamu

+1

Ничего себе это здорово. Спасибо за еще более эффективный способ! –