diff options
author | Martin Odersky <odersky@gmail.com> | 2016-08-26 11:31:52 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-08-26 11:31:59 +0200 |
commit | e61ff6f4cfb632b11b7e54e2904706d382634eda (patch) | |
tree | df76b38a73dccdb52f0ebf7bb47f6e6afc989a28 /tests/disabled | |
parent | 910aa4b4b6b1db98148566ca0b46e026fd5e312d (diff) | |
download | dotty-e61ff6f4cfb632b11b7e54e2904706d382634eda.tar.gz dotty-e61ff6f4cfb632b11b7e54e2904706d382634eda.tar.bz2 dotty-e61ff6f4cfb632b11b7e54e2904706d382634eda.zip |
Dependent method tests
Diffstat (limited to 'tests/disabled')
-rw-r--r-- | tests/disabled/structural-type/pos/depmet_implicit_oopsla_zipwith.scala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/disabled/structural-type/pos/depmet_implicit_oopsla_zipwith.scala b/tests/disabled/structural-type/pos/depmet_implicit_oopsla_zipwith.scala new file mode 100644 index 000000000..83171f865 --- /dev/null +++ b/tests/disabled/structural-type/pos/depmet_implicit_oopsla_zipwith.scala @@ -0,0 +1,44 @@ +case class Zero() +case class Succ[N](x: N) +import Stream.{cons, continually} + +trait ZipWith[N, S] { + type T + + def manyApp: N => Stream[S] => T + def zipWith: N => S => T = n => f => manyApp(n)(continually(f)) +} +object ZipWith { + implicit def ZeroZipWith[S]: ZipWith[Zero,S]{type T = Stream[S]} = new ZipWith[Zero, S] { + type T = Stream[S] + + def manyApp = n => xs => xs + } + + implicit def SuccZipWith[N, S, R](implicit zw: ZipWith[N, R]): ZipWith[Succ[N],S => R]{type T = Stream[S] => zw.T; def zapp[A, B](xs: Stream[A => B],ys: Stream[A]): Stream[B]} = + new ZipWith[Succ[N],S => R] { + type T = Stream[S] => zw.T + + def zapp[A, B](xs: Stream[A => B], ys: Stream[A]): Stream[B] = (xs, ys) match { + case (cons(f, fs), cons(s, ss)) => cons(f(s),zapp(fs, ss)) + case (_, _) => Stream.empty + } + + def manyApp = n => xs => ss => n match { + case Succ(i) => zw.manyApp(i)(zapp(xs, ss)) + } + } +} + +object Test { + def zWith[N, S](n: N, s: S)(implicit zw: ZipWith[N, S]): zw.T = zw.zipWith(n)(s) + + def zipWith0: Stream[Int] = zWith(Zero(),0) + +// (Stream[A]) => java.lang.Object with ZipWith[Zero,B]{type T = Stream[B]}#T +// should normalise to: Stream[A] => Stream[B] + def map[A, B](f: A => B) = zWith(Succ(Zero()),f) + + def zipWith3[A, B, C, D](f: A => B => C => D) = //: Stream[A] => Stream[B] => Stream[C] => Stream[D] = // BUG why do we need a return type? + zWith(Succ(Succ(Succ(Zero()))),f) +} |