Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Catsのtraverse_は要するに高カインドのforeach

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で訊いたところ、traversemapみたいなもので、traverse_foreachみたいなもの、ただし両方ともエフェクトも組み立ててくれるところが違うよね、とのこと:

pure with effect
need value .map .traverse
discard value .foreach .traverse_
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?