Widen types if they are used in typeclass constraints #3061
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Consider this program:
This fails typeclass resolution since type inference gets constraints of the form:
and solves
?u
to the meetx:int{ x > 0 \/ y > x}
. Typeclass instantiation then fails to find an instance at this refined type.There are some ways to workaround this, e.g., by adding explicit instances for refined types
But, this requires the programmer to provide these additional instances.
In this patch, I am changing type inference so that if a variable
?u
appears in a goal that is to be solved by typeclass resolution, then when computing the meet of types in a solution of?u
, I widen the meet to the nearest common named type.With this patch, we now have the following behavior:
This works, resolving to
int
:This fails since there is no instance on nat (since widening goes to the nearest common named type, in this case
nat
)But, this works:
Note, it also works in the unary case, i.e., it widens a type even when there is no meet of two types to take.