From a3aa801a5181da49ec12164d54782e9d61359dfd Mon Sep 17 00:00:00 2001 From: Adriaan Moors Date: Wed, 25 Nov 2009 15:48:19 +0000 Subject: quick fix for #2673: relaxed zipped on Tuple2/T... quick fix for #2673: relaxed zipped on Tuple2/Tuple3 (back to using A => B for constraint instead of A <%< B) --- src/library/scala/Predef.scala | 13 ++++++++++++- src/library/scala/Tuple2.scala | 20 +++++++++----------- src/library/scala/Tuple3.scala | 18 ++++++++---------- test/files/pos/t2673.scala | 4 ++++ 4 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 test/files/pos/t2673.scala diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index d163bca25b..7729dd8886 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -277,8 +277,19 @@ object Predef extends LowPriorityImplicits { // reusing `Function2` and `identity` leads to ambiguities (any2stringadd is inferred) // to constrain any abstract type T that's in scope in a method's argument list (not just the method's own type parameters) // simply add an implicit argument of type `T <:< U`, where U is the required upper bound (for lower-bounds, use: `U <: T`) + // in part contributed by Jason Zaugg sealed abstract class <:<[-From, +To] extends (From => To) - implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x} + implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x} // not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit) + + sealed abstract class =:=[From, To] extends (From => To) + object =:= { + implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x} + } + + sealed abstract class <%<[-From, +To] extends (From => To) + object <%< { + implicit def conformsOrViewsAs[A <% B, B]: A <%< B = new (A <%< B) {def apply(x: A) = x} + } /** A type for which there is aways an implicit value. * @see fallbackCanBuildFrom in Array.scala diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala index 94ccc4c3c3..f558826150 100644 --- a/src/library/scala/Tuple2.scala +++ b/src/library/scala/Tuple2.scala @@ -12,7 +12,7 @@ package scala -import scala.collection.{ TraversableLike, IterableLike } +import scala.collection.{TraversableLike, IterableLike} import scala.collection.generic.CanBuildFrom @@ -29,10 +29,8 @@ case class Tuple2[+T1, +T2](_1:T1, _2:T2) extends Product2[T1, T2] { /** Swap the elements of the tuple */ def swap: Tuple2[T2,T1] = Tuple2(_2, _1) -// TODO: probably loosen zip and zipped from <:< to <%< - - def zip[Repr1, El1, El2, To](implicit w1: T1 <:< TraversableLike[El1, Repr1], - w2: T2 <:< Iterable[El2], + def zip[Repr1, El1, El2, To](implicit w1: T1 => TraversableLike[El1, Repr1], + w2: T2 => Iterable[El2], cbf1: CanBuildFrom[Repr1, (El1, El2), To]): To = { val coll1: TraversableLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 @@ -46,19 +44,19 @@ case class Tuple2[+T1, +T2](_1:T1, _2:T2) extends Product2[T1, T2] { b1.result } - def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 <:< TraversableLike[El1, Repr1], w2: T2 <:< IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] - = new Zipped[Repr1, El1, Repr2, El2](_1, _2) + def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TraversableLike[El1, Repr1], w2: T2 => IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] + = new Zipped[Repr1, El1, Repr2, El2](_1, _2) class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TraversableLike[El1, Repr1], coll2: IterableLike[El2, Repr2]) { // coll2: IterableLike for filter def map[B, To](f: (El1, El2) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { - val b = cbf(coll1.repr) - val elems2 = coll2.iterator + val b = cbf(coll1.repr) + val elems2 = coll2.iterator - for(el1 <- coll1) + for(el1 <- coll1) if(elems2.hasNext) b += f(el1, elems2.next) - b.result + b.result } def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala index 8c669a4c28..b63c5a397f 100644 --- a/src/library/scala/Tuple3.scala +++ b/src/library/scala/Tuple3.scala @@ -12,7 +12,7 @@ package scala -import scala.collection.{ TraversableLike, IterableLike } +import scala.collection.{TraversableLike, IterableLike} import scala.collection.generic.CanBuildFrom @@ -24,11 +24,9 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3) { override def toString() = "(" + _1 + "," + _2 + "," + _3 + ")" -// TODO: probably loosen zip and zipped from <:< to <%< - - def zip[Repr1, El1, El2, El3, To](implicit w1: T1 <:< TraversableLike[El1, Repr1], - w2: T2 <:< Iterable[El2], - w3: T3 <:< Iterable[El3], + def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TraversableLike[El1, Repr1], + w2: T2 => Iterable[El2], + w3: T3 => Iterable[El3], cbf1: CanBuildFrom[Repr1, (El1, El2, El3), To]): To = { val coll1: TraversableLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 @@ -44,10 +42,10 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3) b1.result } - def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 <:< TraversableLike[El1, Repr1], - w2: T2 <:< IterableLike[El2, Repr2], - w3: T3 <:< IterableLike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] - = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3) + def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TraversableLike[El1, Repr1], + w2: T2 => IterableLike[El2, Repr2], + w3: T3 => IterableLike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] + = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3) class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TraversableLike[El1, Repr1], coll2: IterableLike[El2, Repr2], diff --git a/test/files/pos/t2673.scala b/test/files/pos/t2673.scala new file mode 100644 index 0000000000..7f232df3f5 --- /dev/null +++ b/test/files/pos/t2673.scala @@ -0,0 +1,4 @@ +object Test { + val xs = Array(1, 2, 3) + (xs, xs).zipped map (_ + _) +} \ No newline at end of file -- cgit v1.2.3