1
我正在實施takeWhile
性狀的方法Stream
通過foldRight
。 我foldRight
是以下幾點:scala Stream.takeWhile
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
它的返回值是A
,而不是Nothing
?如果不是 - 那麼問題是什麼?
foldRight(Stream.empty [A])..... – jdevelop
嗯,我認爲類型參數可以用在方法聲明中,而不是它的調用...謝謝! – zapadlo