2013-04-08 4 views
0

У меня есть следующий фрагмент кода (это для моего назначения coursea)Scala Список [Char] пуст, но не возвращает истинное

def balance(chars: List[Char]): Boolean = { 
    def innerBalance(chars: List[Char], count: Int): Boolean = { 
    if (chars.isEmpty) count == 0 
    if (chars.head == '(') innerBalance(chars.tail, count+1) 
    if (chars.head == ')') (count > 0) && innerBalance(chars.tail, count-1) 
    innerBalance(chars.tail, count) 
    } 

    innerBalance(chars, 0) 
} 

Из того, что я могу сказать, что это очень похоже на ответ на Стью на этом Scala way to program bunch of if's , но я не знаю, почему заявление

if (chars.isEmpty) count == 0 

всегда быть ложными.

Если я запустить тест, как этот

balance("".toList) 

он просто бросает исключение.

Благодарим за помощь. С уважением,

+0

это не очень идиоматическое использование Скале. Я советовал использовать для использования 'match', чтобы уменьшить многословие и сложность вашего решения. – korefn

ответ

0

Блок как

{ 
    if (a) b 
    c 
} 

будет делать b если a верно, а затем всегда сделать c. Если вы хотите c произойдет только тогда, когда a ложно, вам нужно использовать else:

{ 
    if (a) b 
    else c 
} 
+0

Спасибо, что помогает. Мне нужно явно добавить ключевое слово «return» для каждого из моих операторов. Просто осознал свою проблему сразу после публикации вопроса. – splazit

2

Добавление к Huw's answer, Вы можете также использовать шаблон соответствия, чтобы сделать его более изящным:

 def innerBalance(chars: List[Char], count: Int): Boolean = chars match { 
      case _ if count < 0 => false 
      case Nil    => count == 0 
      case '(' :: rest  => innerBalance(rest, count + 1) 
      case ')' :: rest  => innerBalance(rest, count - 1) 
      case _ :: rest  => innerBalance(rest, count) 
     } 
+0

На самом деле они не могут (сопоставление образцов будет введено только на следующей неделе после задания курса Scala). –

+0

Нет правила против использования вещей, которые не были покрыты. –

4

В Scala вы никогда не должны использовать return, но вместо этого пишите выражения. Основная проблема с приведенным выше кодом заключается в том, что вы не используете выражения if, т. Е. Вы опустили часть else, и поэтому компилятор выводит Unit (пустое Java, что означает, что «ничего» не возвращается).

Поскольку существует несколько альтернатив в вашем случае, я предлагаю вам использовать выражение соответствия:

chars match { 
    case '(' :: Nil => ... 
    case ')' :: Nil => ... 
    case Nil  => count == 0 
    case _   => innerBalance(chars.tail, count) 
} 
Смежные вопросы