2015-08-17 64 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 
    }) 

但我xStream.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

回答