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.
Attributes
- Companion
- object
- Source
- NotGiven.scala
- Graph
-
- Supertypes