mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-24 15:03:46 +00:00
Make sure records don't de-generalize function types, fixing ability let-generalization
Closes #3641
This commit is contained in:
parent
ce8c8f7264
commit
f145f29b1b
2 changed files with 11 additions and 16 deletions
|
@ -3141,9 +3141,17 @@ fn adjust_rank_content(
|
||||||
|
|
||||||
EmptyRecord => {
|
EmptyRecord => {
|
||||||
// from elm-compiler: THEORY: an empty record never needs to get generalized
|
// from elm-compiler: THEORY: an empty record never needs to get generalized
|
||||||
Rank::toplevel()
|
//
|
||||||
|
// But for us, that theory does not hold, because there might be type variables hidden
|
||||||
|
// inside a lambda set but not on the left or right of an arrow, and records should not
|
||||||
|
// force de-generalization in such cases.
|
||||||
|
//
|
||||||
|
// See https://github.com/rtfeldman/roc/issues/3641 for a longer discussion and
|
||||||
|
// example.
|
||||||
|
group_rank
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THEORY: an empty tag never needs to get generalized
|
||||||
EmptyTagUnion => Rank::toplevel(),
|
EmptyTagUnion => Rank::toplevel(),
|
||||||
|
|
||||||
Record(fields, ext_var) => {
|
Record(fields, ext_var) => {
|
||||||
|
|
|
@ -7255,24 +7255,11 @@ mod solve_expr {
|
||||||
# ^
|
# ^
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
// TODO SERIOUS: Let generalization is broken here, and this is NOT correct!!
|
|
||||||
// Two problems:
|
|
||||||
// - 1. `{}` always has its rank adjusted to the toplevel, which forces the rest
|
|
||||||
// of the type to the toplevel, but that is NOT correct here!
|
|
||||||
// - 2. During solving lambda set compaction cannot happen until an entire module
|
|
||||||
// is solved, which forces resolved-but-not-yet-compacted lambdas in
|
|
||||||
// unspecialized lambda sets to pull the rank into a lower, non-generalized
|
|
||||||
// rank. Special-casing for that is a TERRIBLE HACK that interferes very
|
|
||||||
// poorly with (1)
|
|
||||||
//
|
|
||||||
// We are BLOCKED on https://github.com/rtfeldman/roc/issues/3207 to make this work
|
|
||||||
// correctly!
|
|
||||||
// See also https://github.com/rtfeldman/roc/pull/3175, a separate, but similar problem.
|
|
||||||
@r###"
|
@r###"
|
||||||
Fo#f(7) : Fo -[[f(7)]]-> (b -[[] + b:g(4):1]-> {}) | b has G
|
Fo#f(7) : Fo -[[f(7)]]-> (b -[[] + b:g(4):1]-> {}) | b has G
|
||||||
Go#g(8) : Go -[[g(8)]]-> {}
|
Go#g(8) : Go -[[g(8)]]-> {}
|
||||||
h : Go -[[g(8)]]-> {}
|
h : b -[[] + b:g(4):1]-> {} | b has G
|
||||||
Fo#f(7) : Fo -[[f(7)]]-> (Go -[[g(8)]]-> {})
|
Fo#f(7) : Fo -[[f(7)]]-> (b -[[] + b:g(4):1]-> {}) | b has G
|
||||||
h : Go -[[g(8)]]-> {}
|
h : Go -[[g(8)]]-> {}
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue