こういうバグを踏んだ。このコードは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)]
という感じ。
期待していた振舞いは、「a
にleft
が、そしてb
にright
が入っている」というものだが、value withFilter is not a member of cats.effect.IO[(String, String)]
と言われてそもそもコンパイルしない。
なんじゃらほいと思って調べてみたところ、コンパイラのバグだった。
バグチケットも切られているが、切られたのは2012年のことなので、なんと10年間存在するバグだった!!
しょうがないのでこのように迂回するしかない。
def fa = IO.pure("left") def fb = IO.pure("right") for { ab <- fa product fb val (a, b) = ab } yield ()
ほげー。