Cats Effect をいじっていたら、foreach_
というメソッドを見付けた。これはCats Effect独自のメソッドではなくて、Catsに用意されている。
これはほぼtraverse
と同じだ:
import cats.effect.IO import cats.syntax.all.* def message(who: String): IO[String] = IO.pure(s"Hi, $who") def greet(m: String) = IO.println(m) val messages = Vector( message("windymelt"), message("teto"), message("rei"), ) messages.traverse(greet) messages.traverse_(greet)
よく見ると型が違う:
def traverse[G[_], B](f: A => G[B])(implicit ev$1: Applicative[G]): G[F[B]] def traverse_[G[_], B](f: A => G[B])(implicit G: Applicative[G]): G[Unit]
traverse_
を使うとエフェクトを使って計算しつつ値をどんどん棄ててしまう。f
が計算した値を組み直す必要がないので、traverse_
はFoldable
に定義されている。
TypeLevelのDiscordで訊いたところ、traverse
はmap
みたいなもので、traverse_
はforeach
みたいなもの、ただし両方ともエフェクトも組み立ててくれるところが違うよね、とのこと:
pure | with effect | |
---|---|---|
need value | .map |
.traverse |
discard value | .foreach |
.traverse_ |