2012-10-17 108 views
1

你如何使这种方法的工作?斯卡拉foreach返回

def filled(b: Board): Board = { 
    b.next foreach { n => 
    if (n.filled) n 
    else filled(n) 
    } 
} 

我需要先填写N(n.filled ==真)象Java后返回。

现在,我得到:

chess-knight.scala:72: error: type mismatch; 
found : Unit 
required: this.Board 
    b.next foreach { n => 
     ^
one error found 

谢谢!

+0

是什么类型'b.next'? –

+0

对不起,b.next:列表[Board]。 – Etam

回答

6

这不是你所需要的吗?

def filled(b: Board): Board = b.next find {_.filled} get 

提供b.nextSeq[Board]始终至少有一个filledBoard

如果坚持纯粹的功能更喜欢List的方法利用模式匹配:

def filled(b: Board): Board = { 
    b.next match { 
    case n :: _ if(n.filled) => n 
    case _ :: rest => filled(rest) 
    case Nil => throw NoSuchElementException 
} 
+1

是什么让你认为你的第一个解决方案不是纯粹的功能? –

+0

@NikitaVolkov:我的意思是'List'是根据'head'和'tail'来定义的,并且模式匹配利用了这个事实。我们可以想象,'filter'也是用'head'和'tail'定义的,所以第二种方法只使用基本的构造,不需要辅助方法 –

+0

错误地使用术语“纯功能性”。 – missingfaktor