你如何用标准库写foldWhile?

时间:2013-11-29 16:14:58

标签: scala haskell functional-programming

是否可以使用scala标准库编写以下代码?

def foldWhile[A,B](s: Stream[A])(z: B)(w: B ⇒ Boolean)(op: (B, A) ⇒ B): B = {
    if(s.isEmpty) z
    else {
        if(w(z)) foldWhile(s.tail)(op(z, s.head))(w)(op)
        else z
    }
}

foldWhile(Stream(1,2,3,4))(0)(_ <= 3)((acc, v) => acc + v)

2 个答案:

答案 0 :(得分:7)

虽然我个人认为这很脏,但你可以在折叠中间获得回报:

def foldWhile[A,B](s: TraversableOnce[A])(z: B)(w: B ⇒ Boolean)(op: (B, A) ⇒ B): B = 
  s.foldLeft[B](z)((b,a) ⇒ if(w(b)) op(b,a) else return b)

答案 1 :(得分:2)

Stream(1,2,3,4).scanLeft(0){_ + _}.takeWhile(_ <= 3).last

更新1

所以,有趣的故事,我是Guillaume的朋友(他在我到办公室之前问过这个问题)以上就是他想要的,这个bug就在问题的代码中。

但如果你想要问题的确切逻辑,你可以写下这样的东西:

val results = Stream(1,2,3,4).scanLeft(0){_ + _}
val index = results.indexWhere(_ > 3)
results(index)

虽然我还没有找到一个衬垫。

更新2

Stream(1,2,3,4).scanLeft(0){_ + _}.dropWhile(_ <= 3).head