aboutsummaryrefslogtreecommitdiff
path: root/tests/untried/neg-with-implicits/t3346c.scala
diff options
context:
space:
mode:
authorSamuel Gruetter <samuel.gruetter@epfl.ch>2014-03-19 17:53:49 +0100
committerSamuel Gruetter <samuel.gruetter@epfl.ch>2014-03-19 17:53:49 +0100
commitd51d08b444e0ea4a2c13b4daf0ce14b53bfbad89 (patch)
tree1d3a66fc0f5f839a561a2987159cb5b841b89257 /tests/untried/neg-with-implicits/t3346c.scala
parent24ac35546c2c159403e91144e0e4add585ee9ae5 (diff)
downloaddotty-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.scala61
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
+}