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 件のコメント:
コメントを投稿