Writerモナドの使い道 [ログ出力]

def selectIdFromDb(): Writer[List[String], Int] = for {
  _ <- Writer.tell(List("db access start."))
  _ <- Writer.tell(List("TODO: db access 実装"))
  r <- Writer.value[List[String], Int](1)
  _ <- Writer.tell(List("db access   end."))
} yield r

def getInfoFromApiById(id: Int): Writer[List[String], String] = for {
  _ <- Writer.tell(List("db access start."))
  _ <- Writer.tell(List("TODO: api access 実装"))
  r <- Writer.value[List[String], String](s"api info. id=[$id]")
  _ <- Writer.tell(List("db access   end."))
} yield r

val result = for {
  id <- selectIdFromDb()
  info <- getInfoFromApiById(id)
} yield info

// ログ部分と結果部分に別れる
val (logs, infoResult) = result.run

// ログ出力
logs.foreach(println)
/**
  * db access start.
  * TODO: db access 実装
  * db access   end.
  * db access start.
  * TODO: api access 実装
  * db access   end.
  */

// 結果出力
println(infoResult) // api info. id=[1]