A tiny observation here: we don't do "null pointer analysis". We do this kind of analysis for every type: if you invoke a method on a type and that method doesn't exist, you get a compile error. In the case of a type union, all types must respond to that method. "Nil | T" is just one particular type union, but you can also have "Int32 | String", etc.
Thanks, that clears things up. I assumed that Nullpointer analysis was a special case.
To be replaced with an analysis that finds unmatched cases (like None when you assumed Maybe)?
Why would a constructor be confused with a type constructor? I guess I just don't have any experience with this particular approach to "sums". Untagged variants?