2017-03-12 10 views
0

私はマニングの「Scalaでは関数型プログラミング」を通じて作業し、ストリームに問題があり、これはファイルですよ:ScalaのストリームメソッドTakeWhile

package chapter05 


sealed trait Stream[+A]{ 
case object Empty extends Stream[Nothing] 
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A] 

def headOption: A = this match { 
case Empty => throw new Exception("optional") 
case Cons(h, t) => h() 
} 

def toList: List[A] = this match { 
    case Cons(h, t) => h() :: t().toList 
    case Empty => Nil 
} 


    def takeWhile1(p: A => Boolean): Stream[A] = 
    this match { 
    case Cons(h, t) if (p(h())) => Stream.cons(h(), t().takeWhile1(p)) 
    case _ => Empty 
} 


object Stream { 

    def cons[A](hd: => A, tl : => Stream[A]): Stream[A] = { 
    lazy val head = hd 
    lazy val tail = tl 
    Cons(() => head,() => tail) 
    } 
    def empty[A]: Stream[A] = Empty 

    def apply[A](as: A*): Stream[A] = 
    if (as.isEmpty) empty else cons(as.head, apply(as.tail:_*)) 
    } 
} 

適用し、takeWhileは私にはない、コンパイルされません。なぜ、それの論理が正しいと思われるのか知っている(適用は本から取られる)。

+0

私は、少なくとも一つの{欠けがありますが、いくつかの '}' – pedrofurla

+0

が欠けていると思います。 – stholzm

+0

Eclipseは大括弧( "{"、 "}")について不平を言っていません –

答えて

1

それがあったようにあなたは、修正版のコードでは、いくつかの問題を抱えていた:

case object Empty extends Stream[Nothing] 
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A] 
sealed trait Stream[+A]{ 

    def headOption: A = this match { 
    case Empty => throw new Exception("optional") 
    case Cons(h, t) => h() 
    } 

    def toList: List[A] = this match { 
    case Cons(h, t) => h() :: t().toList 
    case Empty => Nil 
    } 


    def takeWhile1(p: A => Boolean): Stream[A] = this match { 
    case Cons(h, t) if (p(h())) => Stream.cons(h(), t().takeWhile1(p)) 
    case _ => Empty 
    } 
} // Missed this 


object Stream { 

    def cons[A](hd: => A, tl : => Stream[A]): Stream[A] = { 
    lazy val head = hd 
    lazy val tail = tl 
    Cons(() => head,() => tail) 
    } 

    def empty[A]: Stream[A] = Empty 

    def apply[A](as: A*): Stream[A] = 
    if (as.isEmpty) empty else cons(as.head, apply(as.tail:_*)) 
    // there was one too many } 
} 

は、コード内のコメントに注目してください。

まず問題は、形質内部短所と空だった、私はそれが理にかなって、それはコンパニオンオブジェクト内またはトップレベルに理にかなってないと思います。

第二の問題、あなたは簡単に括弧のバランスの問題を発見したい、正しくコードをインデントしていた場合。

+0

yrの仕事をありがとうが、それでもまだコンパイルされていません:case Cons(h、t)if(p(h())) => .t()。takeWhile1(p)と同じ:()=>ストリーム作成では、 h() –

+0

あなたはintellijを使用していますか?たぶん虚偽のエラーがあります。 SBTでコンパイルしてみてください。 – pedrofurla

+0

ああ、あなたはEclipseを使用していますか?それはさらに誤ったエラーである可能性が高いです。 – pedrofurla

関連する問題