2016-09-09 4 views
2

, 나는 스칼라 컬렉션 '스트림을 사용하여 nifty recursive implementation을 가로 질러 와서 FS2에 시도에서 나는 이동을 거라고 생각 :FS2를 사용하여 스칼라에서 재귀 피보나치 시퀀스를 구현하는 방법은 무엇입니까? FS2에 익숙해 지도록하는 중에

import fs2.{Pure, Stream} 
    val fibs: Stream[Pure, Int] = Stream[Pure, Int](0) ++ fibs.fold[Int](1)(_ + _) 
    println(fibs take 10 toList) // This will hang 

이에 거는 이유는 무엇입니까 FS2, 그리고 비슷한 해결책을 얻는 가장 좋은 방법은 무엇입니까?

답변

4

문제는 Stream.fold이 스트림의 모든 요소를 ​​사용하여 스크롤해야 볼 수있는 단일 값을 생성한다는 것입니다. 그것은 하나만 요소를 방출합니다.

재귀 스트림은 10 개의 요소가 방출 될 때만 종료됩니다 (take 10으로 지정). 이 스트림은 충분히 생산적이지 않으므로 fold은 계속 중단하지 않고 값을 계속 추가합니다.

이 문제를 해결하는 가장 간단한 방법은 접기 부분 결과를내는 연결자를 사용하는 것입니다. 이것은 scan입니다.

또한 FS2는이 코드에서 대부분의 유형을 유추 할 수 있으므로 반드시 많은 유형의 주석을 필요로하지는 않습니다.

다음 구현은 잘 작동합니다 :

import fs2.{Pure, Stream} 
val fibs: Stream[Pure, Int] = Stream(0) ++ fibs.scan(1)(_ + _) 
println(fibs take 10 toList) 
+0

윽 실제로 스캔을 시도하고 시작하지만, 일부 구문 문제가 있었다 폴드로 전환. 적어도 폴드와 스캔의 차이점을 배웠습니다 ... – bbarker

+0

기능적으로 제공되지 않는 추가 정보 : http://stackoverflow.com/a/17408881/3096687 – bbarker