斯卡拉 Stream.takeWhile

scala Stream.takeWhile

我正在通过 foldRight 实现特征 StreamtakeWhile 方法。 我的 foldRight 如下:

trait Stream[+A] {
  def foldRight[B](z: => B)(f: (A, => B) => B): B =
    uncons.map(t => {
      f(t._1, t._2.foldRight(z)(f))
    }).getOrElse(z)
}

我的takeWhile

def takeWhile(p: A => Boolean): Stream[A] =
  uncons.filter(t => p(t._1)).map(t => Stream.cons(t._1, t._2.takeWhile(p))).getOrElse(Stream.empty)

但我希望它通过 foldRight 实现。这是代码:

def takeWhileViaFoldRight(p: A => Boolean): Stream[A] =
  foldRight(Stream.empty)((x, acc) => {
    if (p(x)) Stream.cons(x, acc) else Stream.empty
  })

但我的 xStream.cons 表达式中带有红色下划线,并出现以下错误:type mismatch; found : x.type (with underlying type A) required: Nothing。我猜这是因为 foldRight 起始值为 Stream.empty —— 没有指示类型 A 因此被认为是 Nothing。如果是这种情况——我如何告诉 foldRight 它的 return 值是 A,而不是 Nothing?如果不是——那么问题是什么?

jdevelop's 的礼貌:

foldRight(Stream.empty[A])

会做的。