2015-08-17 4 views
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? Если нет - в чем проблема?

+1

foldRight (Stream.empty [A]) ..... – jdevelop

+0

Хм, я думал, что параметры типа могут использоваться в объявлении метода, а не в его вызове ... Спасибо! – zapadlo

ответ