Iteratee
適当な説明
- Enumerator -> ストリーム
- Iteratee -> ストリームに対する処理
- Enumeratee -> ストリームの各要素に対する処理
例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Enumerator(1, 2, 3) &> Enumeratee.map(2 *) |>> Iteratee.fold(0)(_ + _) | |
List(1, 2, 3).map(2 *).fold(0)(_ + _) |
scalaz.iterateeとの比較
Scalazのと比較すると簡単に思える不思議。Scalaz
- Scalazではモナド変換子版がベース。
- IterateeにEnumeratee,Enumeratorを適用する。
- 型クラスを利用した実装で提供される関数は多い。
- だが型にうるさい。
- 明示的に型を指定しなければいけないこともしばしば。
Play
- Playでは結果がPromiseで返る。
- EnumeratorにIteratee,Enumerateeを適用する。
- 内部で使うことが目的なので提供される関数は少ない。
- まあfoldあれば事足りるよね。
- 推論が効く!Scalazのより楽だ!
結論:Scalazの方が高機能、Playの方はシンプル
ページ内文字列カウントスクリプト
ワンライナー!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.net.URL | |
import play.api.mvc.Codec | |
import play.api.libs.iteratee._ | |
object Main extends App { | |
Enumerator.fromStream(new URL(args(0)).openStream) &> | |
Parsing.search(implicitly[Codec].encode(args(1))) &> | |
Enumeratee.collect { case Parsing.Matched(_) => 1 } |>> | |
Iteratee.fold(0)(_ + _) map (_ mapDone println) flatMap (_.run) await | |
} |
処理を適用していく感じが関数型言語チックでとても書きやすいです。
0 件のコメント:
コメントを投稿