Upgrade to Pro — share decks privately, control downloads, hide ads and more …

fs2で始める関数型ストリーミング処理入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 fs2で始める関数型ストリーミング処理入門

関数型ストリーミング処理に出会ったときにこわくない程度の感覚を掴むために

Avatar for Kazunari Mori

Kazunari Mori

October 08, 2016
Tweet

Other Decks in Programming

Transcript

  1. • データは次々流れてくる • 自分のところにデータが来たら、自分の やるべき処理を実行 • 処理済みデータは次の担当の元へ • def work(p:

    Pet): Pet = if (p.fallen) raise(p) else p • 1データを処理する関数を作るだけ! • (12本ためて箱に詰める、なども。)
  2. fs2 Stream class Stream F _ O • O •

    F _ • fs2 util Catchable F fs2 Task Catchable F Task F O
  3. • Stream List A def O2 O O2 Stream F

    O2 def O2 O Stream F O2 Stream F O2 def F2 O2 Stream F O Stream F2 O2 Stream F2 O2 Stream Stream Task java sql Connection • Stream Stream Stream
  4. Stream F Byte Stream F String • ascii文字しか無いならば、すべて1文字1バイト。 • でも、半角カタカナはutf-8では3バイト・・・

    • こういうときにChunkという概念が便利。 trait Chunk[+A] • ChunkはA型のデータの幾つかの塊というイメージ
  5. • Stream O2 Chunk Chunk O2 • Chunk A Vector

    A Vector A Chunk Chunk A • 以下の点には注意が必要 • Chunkにはいくつデータが入っているのかわからない。 • どこかChunkに入ったデータは、次のChunkには入らない。 • Chunkのうち使いきれなかった分をキャッシュして、 次のChunkの先頭にくっつける処理が必要になる事が多い。 • Pipe型、Handle型やPull型を参照。 • fs2.textにutf8Decodeなどがあるので、ソースを読めば・・・。
  6. Stream def f[F[_], A]: fs2.Pipe[F, A, (A, A)] = {

    s => for { a <- s.take(1) b <- s.tail.take(1) c <- f(s.tail).cons1((a, b)) } yield c }