Ben Kovitz
Ben Kovitz

Reputation: 5020

Constructor's implicit parameter list can't refer to explicit argument?

With a function, an implicit parameter can have an arg.type where arg is in the explicit parameter list. But apparently, not with a class:

Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_51).

scala> trait Applicable[A]
defined trait Applicable

scala> def f(a: AnyRef)(implicit ev: Applicable[a.type]): a.type = ???
f: (a: AnyRef)(implicit ev: Applicable[a.type])a.type

scala> case class Kniption(a: AnyRef)(implicit ev: Applicable[a.type])
<console>:8: error: not found: value a
       case class Kniption(a: AnyRef)(implicit ev: Applicable[a.type])
                                                              ^
<console>:8: error: type mismatch;
 found   : Applicable[a.type]
 required: Applicable[a.type]
       case class Kniption(a: AnyRef)(implicit ev: Applicable[a.type])
                                               ^

Is this a bug or a feature? If this behavior makes sense, can you explain why?

Upvotes: 0

Views: 107

Answers (1)

vvg
vvg

Reputation: 6385

Looks like in class definition for scala it's not enough information for types inference. What about defining Kniption parametrized:

case class Kniption[T](a: T)(implicit ev: Applicable[T])

Upvotes: 1

Related Questions