你如何用标准库写foldWhile?

Gui*_*ssé 2 haskell functional-programming scala

是否可以使用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)
Run Code Online (Sandbox Code Playgroud)

ste*_*tew 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)
Run Code Online (Sandbox Code Playgroud)