
Jason Dagit
How will this proposal scale with data types that have multiple alternatives that make sense? No natural examples come to mind so how about a contrived example:
data List2 a = Nil | Cons a (List2 a) | Cons2 a a (List2 a)
Now I want to define hd for both Cons and Cons2, but not Nil. Do I use an either type like this? hd :: Either (List2!Cons a) (List2!Cons2 a) -> a
It seems like some other syntax would be desirable here, maybe: hd :: List2!{Cons, Cons2} a -> a
How should it work for functions where no type signature is supplied? Shouldit infer the type we would now and only enable the subset of constructors when the type is explicit as above?
Jason
I agree with your syntax proposal. hd :: List2!{Cons, Cons2} a -> a in functions where no type signature, type inference could work as usual. After normal types passes typechecker with type inference, then Constructor matching could be checked.