diff options
author | Samuel Gruetter <samuel.gruetter@epfl.ch> | 2014-03-19 17:53:49 +0100 |
---|---|---|
committer | Samuel Gruetter <samuel.gruetter@epfl.ch> | 2014-03-19 17:53:49 +0100 |
commit | d51d08b444e0ea4a2c13b4daf0ce14b53bfbad89 (patch) | |
tree | 1d3a66fc0f5f839a561a2987159cb5b841b89257 /tests/untried/neg-with-implicits/t3346c.scala | |
parent | 24ac35546c2c159403e91144e0e4add585ee9ae5 (diff) | |
download | dotty-d51d08b444e0ea4a2c13b4daf0ce14b53bfbad89.tar.gz dotty-d51d08b444e0ea4a2c13b4daf0ce14b53bfbad89.tar.bz2 dotty-d51d08b444e0ea4a2c13b4daf0ce14b53bfbad89.zip |
move all tests in tests/untried/neg which use implicits to tests/untried/neg-with-implicits
Diffstat (limited to 'tests/untried/neg-with-implicits/t3346c.scala')
-rw-r--r-- | tests/untried/neg-with-implicits/t3346c.scala | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/untried/neg-with-implicits/t3346c.scala b/tests/untried/neg-with-implicits/t3346c.scala new file mode 100644 index 000000000..a5ac166b2 --- /dev/null +++ b/tests/untried/neg-with-implicits/t3346c.scala @@ -0,0 +1,61 @@ +object Test extends App { + // + // An attempt to workaround SI-2712, foiled by SI-3346 + // + trait TC[M[_]] + + type EitherInt[A] = Either[Int, A] + + implicit object EitherTC extends TC[EitherInt] + + def foo[M[_]: TC, A](ma: M[A]) = () + + val eii: Either[Int, String] = Right("") + + foo[EitherInt, String](eii) + + // This one needs SI-2712 Higher Order Unification + //foo(eii) // not inferred + + // A workaround is to provide a set of implicit conversions that take values + // based on type constructors of various shapes, and search for the + // type class instances. + // + // This is the approach taken by scalaz7. + + trait TCValue[M[_], A] { + implicit def self: M[A] + def M: TC[M] + + // instead of `foo(eii)`, we'll try `eii.foo` + def foo[M[_], A] = () + } + + + implicit def ToTCValue[M[_], A](ma: M[A])(implicit M0: TC[M]) = new TCValue[M, A] { + implicit val M = M0 + val self = ma + } + implicit def ToTCValueBin1[M[_, _], A, B](ma: M[A, B])(implicit M0: TC[({type λ[α]=M[A, α]})#λ]): TCValue[({type λ[α] = M[A, α]})#λ, B] = new TCValue[({type λ[α]=M[A, α]})#λ, B] { + implicit val M = M0 + val self = ma + } + implicit def ToTCValueBin2[M[_, _], A, B](ma: M[A, B])(implicit M0: TC[({type λ[α]=M[α, B]})#λ]): TCValue[({type λ[α]=M[α, B]})#λ, A] = new TCValue[({type λ[α]=M[α, B]})#λ, A] { + implicit val M = M0 + val self = ma + } + + + ToTCValueBin1(eii).foo + + // as expected, could not find implicit parameter + // ToTCValueBin2(eii).bar + + // error: implicit conversions are not applicable because they are ambiguous, both method ToTCValueBin1 ... and method ToTCValueBin2 + // annoying!! + // https://issues.scala-lang.org/browse/SI-3346 + // + // Works if we remove ToTCValueBin2 + // + eii.bar +} |