2014-09-28 3 views
0

В настоящее время я пытаюсь изучить Scala, поэтому я решил написать простую функцию, чтобы проверить, сбалансированы ли скобки в некотором выражении. Мой код выглядит следующим образомОшибка рассогласования Scala

def balance(chars: List[Char]): Boolean = { 

    def find(par: Char, list: List[Char]): Boolean = { 
    if(list.isEmpty) return false 
    if(list.head == par) { 
     return true 
    } else { 
     find(par, list.tail) 
    } 
    } 

    if(chars.isEmpty) { 
    return false 
    } 
    if(chars.head == '(') { 
    if(!find(')', chars.tail)) { 
     return false 
    } 
    } else { 
    balance(chars.tail) 
    } 
} 

Однако я получаю type mismatch, required: Boolean, found: Unit на линии if(!find(')', chars.tail)). Как это возможно? Я думаю, что функция рекурсии find всегда будет возвращать Boolean. Кстати, я не знаю, правильно ли мое решение, я просто застрял на этом исключении.

+0

Что делать, если условие внутри 'if' не устраивает? Если вы не предоставите часть else, компилятор выведет 'Unit', потому что он не знает, что делать, если' if' терпит неудачу. –

+0

Спасибо, это действительно сработало –

+0

Продолжается ли курс курсуры? –

ответ

3

if/else является выражением выражения в scala, поэтому он возвращает значение.

Оставив ветвь else, компилятор заключает в себе Unit для всего выражения, так как он ничего не может произвести.

Вы должны вернуть Boolean из всех возможных ветвей, чтобы соответствовать методу возврата метода Boolean.

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

if(chars.head == '(' && !find(')', chars.tail)) { 
    return false 
} else { 
    balance(chars.tail) 
} 
+0

Да, я уже сделал это благодаря комментарию @Ende Neu. Спасибо за более подробное объяснение! –

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