Scala 3 でfor内包表記を使ったコードのメモ

scala 3 を使っていて、いい感じにコードを書くことができたので、ここにメモ。

CSVから値を読み込んで直積型に変換する処理を実装していた。

登場する型はRecipeとRecipeRecord。

CSVから読み込んだデータはRecipeRecordで表現されているので、それをRecipeに変換する。

case class RecipeRecord(name: String, description: String)

def convertToRecipe(recipeRecord: RecipeRecord): Either[String, Recipe] = for {
  _     <- validateRecipeName(recipeRecord.name)
  _     <- validateRecipeDescription(recipeRecord.description)
  recipe = Recipe(recipeRecord.name, recipeRecord.description)
} yield recipe

変換をする時に、バリデーションを行う。

バリデーションで失敗すると、EitherのLeft[String]が返るようにしている。一方で、バリデーションが成功すればRight[Unit]が返る。

これをfor内包表記で使うことで、一連の処理をつなげて書くことができた。for内包表記のおかげで短絡も実現できたので、バリデーションが失敗すると関数全体の戻り値はLeft[String]になる。バリデーションが成功すればRithg[Recipe]が返される。

クライアントコードは変換に成功すればRecipe型を、失敗すれば原因を表す文字列を受け取ることができる。