Lambdaカクテル

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

Invite link for Scalaわいわいランド

for式でタプルのbindingが動かないと思っていたら10年モノのバグ(SI-5589)だった

こういうバグを踏んだ。このコードはScala 2.13でコンパイルしない。この例ではCats Effect 3のIOモナドを使っているけれど、どのモナドでも発生する。

def fa = IO.pure("left")
def fb = IO.pure("right")
for {
  (a, b) <- fa product fb // ここでIO[(String, String)]を返して、aとbにそれぞれfaとfbの結果を束縛したい
} yield ()

ちなみにproductの振舞いは(F[A], F[B]) => F[(A, B)]という感じ。

typelevel.org

期待していた振舞いは、「aleftが、そしてbrightが入っている」というものだが、value withFilter is not a member of cats.effect.IO[(String, String)]と言われてそもそもコンパイルしない。

なんじゃらほいと思って調べてみたところ、コンパイラのバグだった。

stackoverflow.com

バグチケットも切られているが、切られたのは2012年のことなので、なんと10年間存在するバグだった!!

issues.scala-lang.org

しょうがないのでこのように迂回するしかない。

def fa = IO.pure("left")
def fb = IO.pure("right")
for {
  ab <- fa product fb
  val (a, b) = ab
} yield ()

ほげー。

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