2012-10-02 116 views
0

我不明白爲了讓scala理解我的函數最終會輸出正確的類型而不是單元的函數和函數部分的順序。我已經提出了評論(第7行和最後一行),這是日食在這些行上告訴我的。任何對編譯器的深入瞭解都非常感謝。正確的函數定義結構?

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

    def rightBraces(chars: List[Char], openCount: Int, closeCount: Int): Boolean = { 
     if (!chars.tail.isEmpty) { 
      if (chars.head == '(') rightBraces(chars.tail, openCount + 1, closeCount) 
      /*type mismatch; found : Unit required: Boolean*/else if (chars.head == ')') rightBraces(chars.tail, openCount, closeCount + 1) 
     } 
     else { 
      if ((chars.head == '(')&&(openCount == (closeCount - 1))) true 
      else if ((chars.head == ')')&&(openCount == (closeCount + 1))) true 
      else (openCount == closeCount) 
     } 
    } 

    def wrongBrace(chars: List[Char]): Boolean = { 
    if (!chars.tail.isEmpty) { 
     if (chars.head == ')') false 
     else if (chars.head == '(') rightBraces(chars.tail, 1, 0) 
     else wrongBrace(chars.tail) 
    } 
    else false 
    } 

    wrongBrace(chars) 

} 
}//Missing closing brace `}' assumed here 
+2

問題是,如果兩個條件都是假的(如果if和else if都是第6行和第7行),那麼您沒有提供值爲else的子句, –

回答

1

的問題就在這裏:

if (!chars.tail.isEmpty) { 
     if (chars.head == '(') rightBraces(chars.tail, openCount + 1, closeCount) 
     else if (chars.head == ')') rightBraces(chars.tail, openCount, closeCount +1) 
    } 

對於內部if塊,有一種可能性,即如果沒有別的也不如果計算結果爲True。在這種情況下,沒有返回值,編譯器默認返回一個單位。

所以你必須在內提供一個默認的情況下,其他人阻止或更改否則,如果其他如果這是適當的。