斯卡拉 Stream.takeWhile
scala Stream.takeWhile
我正在通过 foldRight
实现特征 Stream
的 takeWhile
方法。
我的 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
})
但我的 x
在 Stream.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])
会做的。
我正在通过 foldRight
实现特征 Stream
的 takeWhile
方法。
我的 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
})
但我的 x
在 Stream.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])
会做的。