2014-09-28 88 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) 
    } 
} 

但是我就行了if(!find(')', chars.tail))越來越type mismatch, required: Boolean, found: Unit。這怎麼可能?我認爲find遞歸函數總是會返回一個Boolean。順便說一句,我不知道我的解決方案是否正確,我只是停留在這個例外。

+0

如果在'if'裏面的條件是不是滿意?如果你沒有提供else部分,編譯器會推斷'Unit',因爲如果'if'失敗,他不知道該怎麼做。 – 2014-09-28 15:29:10

+0

謝謝,真的有效 – 2014-09-28 15:35:28

+0

coursera課程是否再次運行? – 2014-09-28 16:37:25

回答

3

if/else是scala中的表達式語句,所以它返回一個值。

退出else分支後,編譯器推斷Unit爲整個表達式,因爲它不能產生任何其他內容。

您必須從每個可能的分支中返回一個Boolean,以匹配方法返回類型Boolean

您可以通過執行修復代碼:

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

是的,我已經這樣做了,感謝@Ende Neu評論。感謝您提供更全面的解釋! – 2014-09-28 15:34:19