Closed
Description
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
.