StackOverflowError on traverse[Kleisli[F, A, ?], B]
Open
Nobody has claimed this yet.
- Dominant language
- Scala
- Stars
- 5.5k
- Forks
- 1.2k
- Avg merge
- 2d 10h
- Merged PRs (30d)
- 5
Description
The following snippet throws a StackOverflowError (assuming kind-projector plugin):
import cats.data.Kleisli
import cats.implicits._
// Probably any F that has Traverse[F], I was trying to use cats.effect.IO
type F[A] = List[A]
List.fill(100000)(1).traverse[Kleisli[F, Int, ?], Int](a => Kleisli.pure(a)).run(1)
The equivalent snippet without Kleisli (List.fill(100000)(1).traverse[F, Int](a => Applicative[F].pure(a))) runs as expected.
Top of the stacktrace:
Exception in thread "main" java.lang.StackOverflowError
at cats.data.KleisliApply.$anonfun$product$2(Kleisli.scala:422)
at cats.data.Kleisli.$anonfun$map$1(Kleisli.scala:19)
at cats.data.KleisliApply.$anonfun$product$2(Kleisli.scala:422)
at cats.data.Kleisli.$anonfun$map$1(Kleisli.scala:19)
at cats.data.KleisliApply.$anonfun$product$2(Kleisli.scala:422)
at cats.data.Kleisli.$anonfun$map$1(Kleisli.scala:19)
at cats.data.KleisliApply.$anonfun$product$2(Kleisli.scala:422)
at cats.data.Kleisli.$anonfun$map$1(Kleisli.scala:19)
...
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the provided 100000-element traverse example and compare it with the non-Kleisli version. Inspect the repeated calls at Kleisli.scala:422 and Kleisli.scala:19, then add regression coverage showing that the Kleisli traversal completes without StackOverflowError.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- scala
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100