diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-09-16 22:26:24 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-09-16 22:26:24 +0000 |
commit | e557acb9a7d672c0635c3eaf9fe385adc41e5c86 (patch) | |
tree | d13db6639464acc57f0e44b4b3ef6f3e607ad403 /test/files/pos/depmet_implicit_oopsla_zipwith.scala | |
parent | ce223fe7abc47af712382a64404604e75f9f4d20 (diff) | |
download | scala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.tar.gz scala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.tar.bz2 scala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.zip |
part 2 of the dependent method refactoring: imp...
part 2 of the dependent method refactoring: improved interaction with
implicit search (needed for oopsla paper)
more to come in this area, see e.g. #3346 (stanford edsl stuff)
reopens #13, which wasn't fixed properly before imo, anyway (have a look at -Xprint:typer output before this commit: a type that's not expressible in surface syntax is inferred -- also removed duplicate test file)
closes #3731: co-evolve type alias type symbols when their rhs is
updated and they are referenced by type selections (see typemap)
review by odersky
Diffstat (limited to 'test/files/pos/depmet_implicit_oopsla_zipwith.scala')
-rw-r--r-- | test/files/pos/depmet_implicit_oopsla_zipwith.scala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/test/files/pos/depmet_implicit_oopsla_zipwith.scala b/test/files/pos/depmet_implicit_oopsla_zipwith.scala new file mode 100644 index 0000000000..c76d02c1ae --- /dev/null +++ b/test/files/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] = new ZipWith[Zero, S] { + type T = Stream[S] + + def manyApp = n => xs => xs + } + + implicit def SuccZipWith[N, S, R](implicit zw: ZipWith[N, R]) = + 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) +}
\ No newline at end of file |