mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
![]() Now, when we have two aliases like ``` T a : [ A, B (U a) ] U a : [ C, D (T a) ] ``` during the first pass, we simply canonicalize them but add neither to the scope. This means that `T` will not be instantiated in the definition of `U`. Only in the second pass, during correction, do we instantiate both aliases **independently**: ``` T a : [ A, B [ C, D (T a) ] ] U a : [ C, D [ A, B (U a) ] ] ``` and now we can mark each recursive, individually: ``` T a : [ A, B [ C, D <rec1> ] ] as <rec1> U a : [ C, D [ A, B <rec2> ] ] as <rec2> ``` This means that the surface types shown to users might be a bit larger, but it has the benefit that everything needed to understand a layout of a type in later passes is stored on the type directly, and we don't need to keep alias mappings. Since we sort by connected components, this should be complete. Closes #2458 |
||
---|---|---|
.. | ||
src | ||
tests | ||
Cargo.toml |