A special class used to implement negation in implicit search.
Consider the problem of using implicit i1
for a query type D
if an implicit
for some other class C
is available, and using an implicit i2
if no implicit
value of type C
is available. If we do not want to prioritize i1
and i2
by
putting them in different traits we can instead define the following:
given i1: D(using ev: C) = ... given i2: D(using ev: NotGiven[C]) = ...
NotGiven
is treated specially in implicit search, similar to the way logical negation
is treated in Prolog: The implicit search for NotGiven[C]
succeeds if and only if the implicit
search for C
fails.
In Scala 2 this form of negation can be simulated by setting up a conditional
ambiguous implicit and an unconditional fallback, the way it is done with the
default
, amb1
and amb2
methods below. Due to the way these two methods are
defined, NotGiven
is also usable from Scala 2.
In Dotty, ambiguity is a global error, and therefore cannot be used to implement negation.
Instead, NotGiven
is treated natively in implicit search.
- Companion:
- object
- Source:
- NotGiven.scala