mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-23 06:25:10 +00:00
![]() The current type inference scheme is such that we first introduce the types for annotation functions, then check their bodies without additional re-generalization. As part of generalization, we also perform occurs checks to fix-up recursive tag unions. However, type annotations can contain type inference variables that are neither part of the generalization scheme, nor are re-generalized later on, and in fact end up forming a closure of a recursive type. If we do not catch and break such closures into recursive types, things go bad soon after in later stages of the compiler. To deal with this, re-introduce the values of recursive values after we check their definitions, forcing an occurs check. This introduction is benign because we already generalized appropriate type variables anyway. Though, the introduction is somewhat unnecessary, and I have ideas on how to make all of this simpler and more performant. That will come in the future. |
||
---|---|---|
.. | ||
docs | ||
src | ||
tests | ||
Cargo.toml |