2012-09-28 20 views
2

我想学习斯卡拉,我是一个新手。我知道这不是最佳的功能代码,并欢迎任何人都可以给我的建议,但我想明白为什么我一直对此功能感到满意。斯卡拉总是回归真实....为什么?

def balance(chars: List[Char]): Boolean = { 
    val newList = chars.filter(x => x.equals('(') || x.equals(')')); 
    return countParams(newList, 0) 
    }            

    def countParams(xs: List[Char], y: Int): Boolean = { 
    println(y + " right Here") 
    if (y < 0) { 
     println(y + " Here") 
     return false 
    } else { 
     println(y + " Greater than 0") 
     if (xs.size > 0) { 
     println(xs.size + " this is the size") 
     xs match { 
      case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1) 
      case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1) 
      case xs => 0 
     } 
     } 
    } 
    return true; 
    } 
    balance("()())))".toList) 

我知道,我打我的if语句的假分支,但它仍然在我的函数结束时返回true。请帮助我理解。谢谢。

+2

因为你在方法的末尾写了true。 – phant0m

+0

我也在使用#progfun,并且我认为我的家庭作业解决方案中没有多少代码行。 –

回答

3

您要么必须更明确地表明您要返回的内容,要么使其对编译器更加明确。这工作:

def countParams(xs: List[Char], y: Int): Boolean = { 
    println(y + " right Here") 
    if (y < 0) { 
     println(y + " Here") 
     false 
    } else { 
     println(y + " Greater than 0") 
     if (xs.size > 0) { 
     println(xs.size + " this is the size") 
     xs match { 
      case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1) 
      case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1) 
      case xs => false 
     } 
     } else { 
     true 
     } 
    } 
} 

if每个分支上面的代码,所以编译器假定它是要返回的值返回一定的价值。顺便说一句没有日志记录和更多的惯用语:

def countParams(xs: List[Char], y: Int) = 
    xs match { 
     case Nil => y == 0 
     case '(' :: rest => countParams(rest, y + 1) 
     case ')' :: rest if(y > 0) => countParams(rest, y - 1) 
     case _ => false //must be closing parens but y < 0 
    } 
2

scala中的if是一个表达式。它返回一个值,如果在其他语言中,它在概念上与三元相似。

如果你想在你的else分支中返回一些东西,你应该有一个嵌套的if和else来允许它返回一个值。

换句话说,countParams正在评估所有代码并落在正在分配给countParams的块({})中的最后一行。那就是,true;

简而言之,在countParams的末尾丢失true,并给出您的嵌套,如果其他返回有意义的东西。