On 7/23/2020 2:38 PM, Remi Forax wrote:
Don't do deconstruction now ! We are not ready :)

Now I'm confused.  Didn't I say exactly that in the first paragraph?

On guards, they do not work well with exhaustiveness. Still not sure they are useful.

It works fine, it's just more work for the user to get right.

We induce a domination ordering on patterns.  If `T <: U`, then `T t` < `U u` (`T t` is less specific than `U u`.)  Similarly, for all guard conditions g, `P & g` < `P`.  What this says is that if you want exhaustiveness, you need an unguarded pattern somewhere, either:

    case A:
    case B & g:
    case B:              // catches B & !g
    case C:

or

    case A:
    case B & g:
    case C:
    case Object:    // catches B & !g

I understand your diffidence about guards, but I'm not sure we can do nothing.  The main reason that some sort of guards feel like a forced move (could be an imperative guard, like `continue`, but I don't think anyone would be happy with that) is that the fall-off-the-cliff behavior is so bad.  If you have a 26-arm switch, and you want the equivalent of the second of the above cases -- B-but-not-g gets shunted into the bottom clause -- you may very well have to refactor away from switch, or at least mangle your switch badly, which would be pretty bad.

On nullity, I prefer the total pattern to be explicit instead of implicit (given we have var, the type on the expression taken by the switch can be fuzzy for someone doing a quick look to the code), case any x, case _ x or whatever the syntax is, is more readable IMO.

It is unfortunate that `var x` is more fuzzy about types, but less fuzzy about totality (`var x` is always total.)  It is also unfortunate that `default` can't be our "any" clause.   Not sure that introducing a third thing is helpful, though.

Reply via email to