2014-12-23 1 views
2

단일 스트림으로 결합하는 방법을 생각해 낼 수 없습니다. 내가 가진 :스칼라에서 이전 값과 두 번째 스트림을 기반으로 스트림을 만듭니다.

Stream(
    init, 
    nextFoo(init, bar1), 
    nextFoo(nextFoo(init, bar1), bar2), 
    nextFoo(nextFoo(nextFoo(init, bar1), bar2), bar3), 
    nextFoo(nextFoo(nextFoo(nextFoo(init, bar1), bar2), bar3), bar1), 
    ... 
) 

또는, 즉, 각 요소는 loop 다음 요소 내 출력 스트림에서 이전 요소에 따라 달라집니다 : 내가 원하는 것은이 같은 스트림

val loop: Stream[Bar] = Stream(bar1, bar2, bar3) #::: loop 
val init: Foo = new Foo() 
def nextFoo(foo: Foo, bar: Bar): Foo = { ... } 

입니다.

닭고기 및 달걀 문제입니다. zip 첫 번째 스트림과 함께 두 번째 스트림을 만들고 싶지만 두 번째를 압축하지 않고 첫 번째 스트림을 만들 수 없습니다 (예 : Stream.iterate).

스칼라의 콜렉션 라이브러리에있는 함수만으로 가능합니까? 나는 아마도 (new Iterator { ... }).toStream과 함께 뭔가를 집어 넣을 수 있지만 가능하다면 그것을 피하고자합니다. "가짜"바 푸 그 뜻

답변

2

는 다음과 같이 표시됩니다 "처리"바의 목록이 포함되어 있습니다 :

case class Bar(s: String) 
    val bar1 = Bar("bar1") 
    val bar2 = Bar("bar2") 
    val bar3 = Bar("bar3") 

    case class Foo(bars: Seq[Bar]) 


    val loop: Stream[Bar] = Stream(bar1, bar2, bar3) #::: loop 
    val init: Foo = new Foo(Nil) 
    def nextFoo(foo: Foo, bar: Bar): Foo = 
    foo.copy(bars = foo.bars :+ bar) 

    val foos: Stream[Foo] = Stream(init) #::: foos.zip(loop).map({ case (f, b) => nextFoo(f, b) }) 

    foos.take(10).toList.foreach(println) 

결과 : 응답에 대한

Foo(List()) 
Foo(List(Bar(bar1))) 
Foo(List(Bar(bar1), Bar(bar2))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2), Bar(bar3))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2))) 
Foo(List(Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2), Bar(bar3), Bar(bar1), Bar(bar2), Bar(bar3))) 
+0

감사합니다! 방금 같은 결과를 갖는 알고리즘을 생각해 냈습니다 :'Stream.iterate ((init, loop)) {case (f, b # :: bs) => (nextFoo (f, b), bs)} .map (_. 1)'. 나에게 너는 덜 어색해. 이 솔루션과 솔루션을 어떻게 비교할 것입니까? –

+0

해결책을 편집했습니다.'Stream (init) # ::: ...'대신'init # :: ...'을 사용할 수 있습니다. –

관련 문제