2017-02-20 9 views
2

Я пытаюсь создать функцию, которая возвращает список, содержащий списки булевых в Scala. До сих пор функция выглядит следующим образом:Scala: выражение типа Unit не соответствует типу List [List [Boolean]]

def listListBool(n: Int): List[List[Boolean]] = { 
    val empty: List[List[Boolean]] = null 
    if (n == 0) {empty} 
    else if (n ==1) {val bools = List(List(true, false)) 
} 

«иначе если» часть флагов заявление с ошибкой: «Выражение типа блока не соответствует типа List [Список [Boolean]]» хотя я указал, что программе необходимо вернуть список списков логических элементов. Я также пробовал следующий синтаксис:

else if (n == 1) {val bools: List[List[Boolean]] = List(List(true, false) 

Но эта же ошибка все еще производится. Я пропустил что-то действительно очевидное здесь? Я чувствую, что часами смотрю на это, и я все еще не могу понять, что я ошибаюсь.

Пожалуйста, имейте в виду, что я совершенно новый для Scala, и я не совсем знаком со всеми языками и синтаксисом.

EDIT: Я ответил на некоторые комментарии по этому поводу, в которых говорится, что после исправления этой проблемы необходимо добавить «еще». Просматривая ваши комментарии, я попробовал добавить один так или иначе, и это было исправлено. Я до сих пор не совсем понимаю, как это изменит тип возврата от «Any» до нужного типа, но тем не менее работает.

ответ

1

С этим кодом связано несколько проблем. Во-первых у вас есть структура, как

if ... 
else if ... 

Это неправильно, потому что это дало бы Unit если ни первое, ни второе условие было выполнено. Чего вы хотите:

if ... 
else if ... //optional 
else .... 

Во-вторых присваивание всегда дает Unit и val bools: List[List[Boolean]] = List(List(true, false) это задание. Просто напишите List(List(true, false).

В-третьих, если вы хотите вернуть пустой список, вы должны написать:

List.empty 

или лучше

Nil 

Я удивлен, что вы не получите сообщение об ошибке для возвращения null.

+0

«else» следует за «else if», но я хотел, чтобы ошибка была исправлена, прежде чем двигаться вперед. Приняли ваш совет по возврату пустых списков. Имеет гораздо больше смысла! Я не знаю, почему я раньше не использовал его. Спасибо за совет! – LittleAngryProgrammer

+0

@haffla, Он не возвращает null. Он возвращает допустимый тип, который имеет значение null. –

+0

Я вижу, это просто не очень хорошо Стиль Скалы – haffla

1

val bools: List[List[Boolean]] = List(List(true, false) является назначение, имеющее тип Unit, которого вы хотите List(List(true, false) без указания.

+0

Это само по себе не устранит проблему. – pedrofurla

+0

Попробовали это, и он возвращается с той же ошибкой, за исключением типа «Любой», а не «Единицы». – LittleAngryProgrammer

0

Вы можете просто написать более простую версию вместо функции, выполняющей то же самое.

def listListBool(n:Int) = if(n==0) Nil else List(List(true,false)) 

Если вы используете язык классов, использование null должно быть полностью устранено.

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