Scala Programming Language
  1. Scala Programming Language
  2. SI-6434

Type pretty-printer omits parentheses around by-name params, writing => A => B instead of (=> A) => B

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: Scala 2.9.2, Scala 2.10.0
    • Fix Version/s: Scala 2.10.1
    • Component/s: Misc Compiler
    • Labels:
      None

      Description

      Variation of https://issues.scala-lang.org/browse/SI-5661:

      $ ./qbin/scala
      Welcome to Scala version 2.10.0-20120925-012651-d6a933c4f5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
      Type in expressions to have them evaluated.
      Type :help for more information.
      
      scala> def f(x: => Int): Int = x
      f: (x: => Int)Int
      
      scala> f _
      res0: => Int => Int = <function1>
      

      Note: d6a933c4f5 is a local commit on top of ffaa3cb89edc1407c99c89f36248358c16887fe7 from 2.10.x, but it's just a small change:

      --- a/src/library/scala/package.scala
      +++ b/src/library/scala/package.scala
      @@ -95,7 +95,10 @@ package object scala {
         val Equiv = scala.math.Equiv
       
         type Fractional[T] = scala.math.Fractional[T]
      +  val Fractional = scala.math.Fractional
      +
         type Integral[T] = scala.math.Integral[T]
      +  val Integral = scala.math.Integral
       
         type Numeric[T] = scala.math.Numeric[T]
         val Numeric = scala.math.Numeric
      

        Activity

        Hide
        Josh Suereth added a comment -

        while the () is useful, I don't think this is actually a bug, more an improvement. IIRC, => A => B => C is a valid function type.

        Show
        Josh Suereth added a comment - while the () is useful, I don't think this is actually a bug, more an improvement. IIRC, => A => B => C is a valid function type.
        Hide
        Paolo G. Giarrusso added a comment - - edited

        => A => B is a valid type, just the wrong one. Right-associativity makes that equal to => (A => B) (I'd file a separate bug otherwise), while we want a different type, (=> A) => B; hence omitting parentheses changes the type. The REPL output below suggests that => A => B is indeed right-associative as expected:

        scala> val v: ((=> Int) => Int) = f _
        v: => Int => Int = <function1>
        
        scala> val v: (=> (Int => Int)) = f _
        <console>:1: error: no by-name parameter type allowed here
               val v: (=> (Int => Int)) = f _
                       ^
        
        scala> val v: (=> Int => Int) = f _
        <console>:1: error: no by-name parameter type allowed here
               val v: (=> Int => Int) = f _
                       ^
        
        Show
        Paolo G. Giarrusso added a comment - - edited => A => B is a valid type, just the wrong one. Right-associativity makes that equal to => (A => B) (I'd file a separate bug otherwise), while we want a different type, (=> A) => B; hence omitting parentheses changes the type. The REPL output below suggests that => A => B is indeed right-associative as expected: scala> val v: ((=> Int) => Int) = f _ v: => Int => Int = <function1> scala> val v: (=> (Int => Int)) = f _ <console>:1: error: no by-name parameter type allowed here val v: (=> (Int => Int)) = f _ ^ scala> val v: (=> Int => Int) = f _ <console>:1: error: no by-name parameter type allowed here val v: (=> Int => Int) = f _ ^
        Hide
        Adriaan Moors added a comment -

        James, care to put some more parens in our types? (Because we like parens.)

        Show
        Adriaan Moors added a comment - James, care to put some more parens in our types? (Because we like parens.)
        Show
        James Iry added a comment - https://github.com/scala/scala/pull/1958

          People

          • Assignee:
            James Iry
            Reporter:
            Paolo G. Giarrusso
          • Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development