Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adapt function arguments to n-ary prototype #14651

Merged
merged 1 commit into from Mar 13, 2022
Merged

Conversation

odersky
Copy link
Contributor

@odersky odersky commented Mar 9, 2022

If a function argument is a synthetic term of the form

x$1 => x$1 match case (a_1, ..., a_n) => e

and the expected type is an n-ary function type, rewrite the argument to

(a_1, ..., a_n) => e

Fixes #14626.

The example in #14626 now compiles without an implicit tupling conversion.
Such a conversion was inserted before in 2.13, 3.0 and 3.1.

If a function argument is a synthetic term of the form

  x$1 => x$1 match case (a_1, ..., a_n) => e

and the expected type is an n-ary function type, rewrite the argument to

  (a_1, ..., a_n) => e

Fixes scala#14626.

The example in scala#14626 now compiles without an implicit tupling conversion.
Such a conversion was inserted before in 2.13, 3.0 and 3.1.
Copy link
Member

@dwijnand dwijnand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks nice!

Copy link
Collaborator

@griggt griggt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is very appealing, however is the following change in semantics expected?

@main def Test =
  val xs = for {
    (a, b) <- List("a", "b", "c").lazyZip(List(1, 2, 3))
  } yield { println(s"computing $a + $b"); a + b }
  println("and the result is:")
  println(xs.toList)
$ scalac lazyzip.scala && scala Test
and the result is:
computing a + 1
computing b + 2
computing c + 3
List(a1, b2, c3)
$ scalac -source:future lazyzip.scala && scala Test
computing a + 1
computing b + 2
computing c + 3
and the result is:
List(a1, b2, c3)

I suppose this could be considered an implementation detail, and anyone unwittingly relying on the current behavior should have written

-  (a, b) <- List("a", "b", "c").lazyZip(List(1, 2, 3))
+  (a, b) <- List("a", "b", "c").lazyZip(List(1, 2, 3)).view

@odersky
Copy link
Contributor Author

odersky commented Mar 11, 2022

I think the expectation always was that the program is equivalent to

@main def Test =
  val xs = List("a", "b", "c").lazyZip(List(1, 2, 3)).map { (a, b) =>
    println(s"computing $a + $b"); a + b
  }
  println("and the result is:")
  println(xs.toList)

So the old behavior would count as a bug, IMO.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

"Wrong number of parameters" error in for expression under -source: future
4 participants