2015年6月13日土曜日

scala関数型デザイン&プログラミング P134

Exercise 7.6 リストの要素を並行してフィルタリングするparFilterを実装せよ。
解答は
def parFilter[A](l: List[A])(f: A => Boolean): Par[List[A]] = {
  val pars: List[Par[List[A]]] =
    l map (asyncF((a: A) => if (f(a)) List(a) else List()))
  map(sequence(pars))(_.flatten)
}
 asyncF(  (a: A) => if (f(a)) List(a) else List() ) の部分を見ると
  def asyncF(f:A=>B):A=>Par[B] なので 返り値は A=>Par[List[A]]となっている。
したがって、
  l map (asyncF((a: A) => if (f(a)) List(a) else List())) により  List[Par[List[A]]]になることがわかる。
これをsequenceの引数とすれば,Par[List[List[A]]]に変換される。
flattenはリストの結合なので、Par[List[A]]となるようだ。

0 件のコメント:

コメントを投稿