Я реализую 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