- Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Labels
Description
Minimized code
trait A { def apply():Int } trait B { def apply():Int } class MWE2 { type Op = (A, B) ?=> Int def doOp(op:Op):Int = { implicit val a:A = new A{ def apply():Int = 2} implicit val b:B = new B{ def apply():Int = 3} op } def main(args:Array[String]):Unit = { val op:Op = { summon[A]() + summon[B]() } implicit val a:A = new A{ def apply():Int = 6} implicit val b:B = new B{ def apply():Int = 7} Console.println(doOp(op)) } }
Output
[error] 17 | summon[A]() + summon[B]() [error] | ^ [error] |ambiguous implicit arguments: both value evidence$1 and value a match type A of parameter x of method summon in object Predef [error] -- Error: src/main/scala/MWE2.scala:21:27 [error] 21 | Console.println(doOp(op)) [error] | ^ [error] |ambiguous implicit arguments: both value evidence$5 and value a match type A of parameter of MWE2.this.Op [error] |which is an alias of: (A, B) ?=> Int [error] two errors found [error] (Compile / compileIncremental) Compilation failed [error] Total time: 8 s, completed Dec 16, 2020 5:48:13 PM
Expectation
op
should not be invoked in main
but should instead be passed to doOp
.
Additionally, if the compiler is supposed to invoke it in main
(which would be very surprising), the result should be a type error (found Int
, required Op
).
Further a
should not be ambiguous with some anonymous evidence when I'm not even using any context bounds or anything else implicits / givens related that would be generating evidence.