Skip to content

Type inference doesn't work correctly for union types used with extension method #18626

Closed
@kpodsiad

Description

@kpodsiad

Compiler version

3.3.1

Minimized code

//> using scala "3.3.1"

trait Random[F[_]] {
  def element[T](list: Seq[T]): F[T] = ???
}

trait Monad[F[_]] {
  def map[A, B](fa: F[A])(f: A => B): F[B]
  def flatMap[A, B](fa: F[A])(f: A => F[B]): F[B]
}

object Monad {
  extension [F[_]: Monad, A](fa: F[A])
    def map[B](f: A => B): F[B] = ???
    def flatMap[B](f: A => F[B]): F[B] = ???
}

sealed trait Animal
object Animal {
  object Cat extends Animal
  object Dog extends Animal
}

type Mammal = Animal.Cat.type | Animal.Dog.type
val mammals: List[Mammal] = ???

def work[F[_]](random: Random[F])(using mf: Monad[F]) = {
  val result: F[Mammal] =
    mf.map(fa = random.element(mammals))(a => a)

  val result2: F[Mammal] = Monad.map(random.element(mammals))(a => a)

  import Monad.*

  val result3: F[Mammal] = random
    .element(mammals)
    .map { a =>
       a // << a is an Animal, compilation error
    }
}

Output

There is a compilation error in result3

Found:    (a : Animal)
Required: Animal.Cat.type | Animal.Dog.type

Expectation

result3 works correctly, the same as 1 & 2, inferred type should be Cat | Dog or Mammal.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions