Lambdaカクテル

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

Invite link for Scalaわいわいランド

Noneは空文字に写したい、そんな君のためにcombineAllがある

Scalaをやっていて、val x: Option[String] = None""に写したいことが100万回くらいある。しかしx.getOrElse("")と書くのは納得いかない、という状況になっていた。

なぜかというと、Stringはモノイドだし、モノイドには空要素emptyがあるはずで、Option[A : Monoid]みたいな型があったら、Noneのときはemptyに写したい、というのは結構自明によくあるシチュエーションなのではないかと思って悶々としていた。どこかに既に実装があるはずだけれど、どこにあるのかわからない!!!

  • Option[String]だったら""に写せばよい
  • Option[List[A]]だったら[]に写せばよい
  • などなど

そうそう、そういうのが欲しいんです。

すると、人々に助けてもらえて、combineAllというのがcatsFoldableに定義されているということがわかった。

Foldableだったのか〜〜〜

github.com

確かに、畳み込むという文脈で考えれば、自然とNoneemptyにするべきでしょ、と考えることになりそう。

import cats._
import cats.implicits._

val x: Option[String] = Some("foo")
val y: Option[String] = None

// 顧客が本当に必要だったもの
println(s"x = '${x.combineAll}'")
println(s"y = '${y.combineAll}'")

// combineしてももちろん使える
val xy = x |+| y
println(s"xy = '${xy.combineAll}'")

/*
x = 'foo'
y = ''
xy = 'foo'
*/

追記

orEmptyというのもあるとのことだった。Optionであればこれで良さそう。ListなどであればFoldablecombineAllを使うと良さそう。

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