2014-09-28 85 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