Skip to content

derived Traverse fails on case objects #72

@ceedubs

Description

@ceedubs

Consider the following Option-like ADT:

@deriveTraverse
sealed abstract class MyExprF[+A] extends Product with Serializable

object MyExprF {
  final case class Const[+A](value: A) extends MyExprF[A]
  case object Noll extends MyExprF[Nothing]
}

The derived traverse method in the Traverse instance throws a MatchError on the Noll case:

scala> import cats.implicits._
import cats.implicits._

scala> val c: MyExprF[Int] = Const(3)
c: qq.droste.examples.MyExprF[Int] = Const(3)

scala> c.traverse(Option.apply) // expected output
res0: Option[qq.droste.examples.MyExprF[Int]] = Some(Const(3))

scala> val n: MyExprF[Int] = Noll
n: qq.droste.examples.MyExprF[Int] = Noll

scala> n.traverse(Option.apply) // I would expect Some(Noll)
scala.MatchError: Noll (of class qq.droste.examples.MyExprF$Noll$)
  at qq.droste.examples.MyExprF$$anon$1.traverse(TestExpr.scala:6)
  at qq.droste.examples.MyExprF$$anon$1.traverse(TestExpr.scala:6)
  at cats.Traverse$Ops.traverse(Traverse.scala:19)
  at cats.Traverse$Ops.traverse$(Traverse.scala:19)
  at cats.Traverse$ToTraverseOps$$anon$3.traverse(Traverse.scala:19)
  ... 36 elided

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions