Annotations of the form e : ? are basically equivalent in behaviour to a non-empty hole {? e ?}. They often seem to appear as tricky special cases and in some examples of bugs in our system. Would it simplify things if we banned annotations of this form?
Right now, when you add an annotation to an expression, the type is defaulted to ?. This change would mean that we instead default the type to be whatever the type of e actually is. More precisely, if e synthesises T then we would produce e : T, otherwise if e is successfully checked against S during typechecking, we would produce e : S. Since a successful typechecking pass must synthesise or check every expression, this approach will always find a type.
This change doesn't completely prevent holes appearing in annotations. For example, if we add an annotation to a hole we will get ? : ?, since holes synthesise the hole type. The same applies to non-empty holes: adding an annotation to {? Zero ?} will yield {? Zero ?} : ?.
To deal with these two cases, we could disallow annotations on holes. The type of a hole is always ?, so we can argue that annotations are never necessary. But they can be useful if you know what the type of the expression should be, but haven't finished constructing it yet.
So I'm not sure if there's a clear path here, but I think it's worth thinking about.
Annotations of the form
e : ?are basically equivalent in behaviour to a non-empty hole{? e ?}. They often seem to appear as tricky special cases and in some examples of bugs in our system. Would it simplify things if we banned annotations of this form?Right now, when you add an annotation to an expression, the type is defaulted to
?. This change would mean that we instead default the type to be whatever the type ofeactually is. More precisely, ifesynthesisesTthen we would producee : T, otherwise ifeis successfully checked againstSduring typechecking, we would producee : S. Since a successful typechecking pass must synthesise or check every expression, this approach will always find a type.This change doesn't completely prevent holes appearing in annotations. For example, if we add an annotation to a hole we will get
? : ?, since holes synthesise the hole type. The same applies to non-empty holes: adding an annotation to{? Zero ?}will yield{? Zero ?} : ?.To deal with these two cases, we could disallow annotations on holes. The type of a hole is always
?, so we can argue that annotations are never necessary. But they can be useful if you know what the type of the expression should be, but haven't finished constructing it yet.So I'm not sure if there's a clear path here, but I think it's worth thinking about.