The code below fails to compile, with the following note at the end of the error message:
Note: given instance given_NatDividesH_X_Succ_Z in object NatDividesH was not considered because it was not imported with `import given`.
I tried adding import NatDividesH.given
in all places I could think of, but the note remained.
Here is the original code:
sealed trait NatT
final case class Zero() extends NatT
final case class Succ[+N <: NatT](n: N) extends NatT
sealed trait NatDividesH[X <: Succ[NatT], Y <: NatT, Z <: NatT]
object NatDividesH:
given [X <: Succ[NatT]]: NatDividesH[X, _0, _0]()
given [X <: Succ[NatT], Y <: NatT](using NatDividesH[X, Y, _0]): NatDividesH[X, Y, X]()
given [X <: Succ[NatT], Y <: NatT, Z <: NatT](using NatDividesH[X, Y, Succ[Z]]): NatDividesH[X, Succ[Y], Z]()
sealed trait NatDivides[X <: Succ[NatT], Y <: NatT]
object NatDivides:
given [X <: Succ[NatT], Y <: NatT](using proof: NatDividesH[X, Y, _0]): NatDivides[X, Y]()
@main def main(): Unit =
summon[NatDivides[_2, _2]]
type _0 = Zero
type _1 = Succ[_0]
type _2 = Succ[_1]
type _3 = Succ[_2]
Here is the code with given imports added everywhere, to no avail:
import NatDividesH.given
sealed trait NatT:
import NatDividesH.given
final case class Zero() extends NatT:
import NatDividesH.given
final case class Succ[+N <: NatT](n: N) extends NatT:
import NatDividesH.given
sealed trait NatDividesH[X <: Succ[NatT], Y <: NatT, Z <: NatT]:
import NatDividesH.given
object NatDividesH:
import NatDividesH.given
given [X <: Succ[NatT]]: NatDividesH[X, _0, _0] with
import NatDividesH.given
given [X <: Succ[NatT], Y <: NatT](using NatDividesH[X, Y, _0]): NatDividesH[X, Y, X] with
import NatDividesH.given
given [X <: Succ[NatT], Y <: NatT, Z <: NatT](using NatDividesH[X, Y, Succ[Z]]): NatDividesH[X, Succ[Y], Z] with
import NatDividesH.given
sealed trait NatDivides[X <: Succ[NatT], Y <: NatT]:
import NatDividesH.given
object NatDivides:
import NatDividesH.given
given [X <: Succ[NatT], Y <: NatT](using proof: NatDividesH[X, Y, _0]): NatDivides[X, Y] with
import NatDividesH.given
@main def main(): Unit =
import NatDividesH.given
summon[NatDivides[_2, _2]]
type _0 = Zero
type _1 = Succ[_0]
type _2 = Succ[_1]
type _3 = Succ[_2]