scala3 icon indicating copy to clipboard operation
scala3 copied to clipboard

The match type contains an illegal case; what makes it illigal?

Open Adam-Vandervorst opened this issue 3 months ago • 1 comments

Compiler version

3.4.1

Minimized example

trait Poly
trait -->[X <: Poly, Y <: Poly] extends Poly
trait +[X <: Poly, Y <: Poly] extends Poly
trait *[X <: Poly, Y <: Poly] extends Poly

type Hinze[X <: Poly] = X match {
  case (k1 + k2) --> v => (k1 --> v) * (k2 --> v)
  case (k1 * k2) --> v => k1 --> (k2 --> v)
}

Output Error/Warning message

                    The match type contains an illegal case:
                        case (k1 + k2) --> v => (k1 --> v) * (k2 --> v)
                    (this error can be ignored for now with `-source:3.3`)

Why this Error/Warning was not helpful

The message was unhelpful because it only stated there was a problem, not what that problem was. It takes significant time to figure that out (I've tried with and without infix notation and with and without parenthesis).

Suggested improvement

It could be made more helpful by additionally stating (just for illustration), "Unbound variables in the LHS of a match type case need a type upper bound".

Note

I still don't know why I -source:3.3 to make this compile.

Adam-Vandervorst avatar Apr 25 '24 15:04 Adam-Vandervorst

great issue, thanks for reporting! I agree it would be good to see a suggestion of what is the problem precisely

if you didn't already find out why, this is one way to fix the error:

type Hinze[X <: Poly] = X match {
  case foo --> v => foo match {
    case (k1 + k2) => (k1 --> v) * (k2 --> v)
    case (k1 * k2) => k1 --> (k2 --> v)
  }
}

if you want some intuition, match types resolve with similar semantics to what an equivalent runtime match expression would. And at runtime you can only type-test on the erased class type.

bishabosha avatar Apr 26 '24 07:04 bishabosha