not so fast

This commit is contained in:
Folkert 2021-07-21 22:17:53 +02:00
parent 564efd528a
commit 6ab90cd15d
2 changed files with 14 additions and 7 deletions

View file

@ -585,7 +585,7 @@ pub fn chase_ext_tag_union(
fields: &mut Vec<(TagName, Vec<Variable>)>,
) -> Result<(), (Variable, Content)> {
use FlatType::*;
match subs.get_without_compacting(var).content {
match subs.get_content_without_compacting(var) {
Content::Structure(EmptyTagUnion) => Ok(()),
Content::Structure(TagUnion(tags, ext_var))
| Content::Structure(RecursiveTagUnion(_, tags, ext_var)) => {
@ -593,16 +593,16 @@ pub fn chase_ext_tag_union(
fields.push((label.clone(), vars.to_vec()));
}
chase_ext_tag_union(subs, ext_var, fields)
chase_ext_tag_union(subs, *ext_var, fields)
}
Content::Structure(FunctionOrTagUnion(tag_name, _, ext_var)) => {
fields.push((tag_name, vec![]));
fields.push((tag_name.clone(), vec![]));
chase_ext_tag_union(subs, ext_var, fields)
chase_ext_tag_union(subs, *ext_var, fields)
}
Content::Alias(_, _, var) => chase_ext_tag_union(subs, var, fields),
Content::Alias(_, _, var) => chase_ext_tag_union(subs, *var, fields),
content => Err((var, content)),
content => Err((var, content.clone())),
}
}

View file

@ -455,7 +455,14 @@ fn unify_tag_union(
(Some(v1), Some(_v2)) => Some(v1),
};
if tags1.len() == 1 && tags2.len() == 1 && tags1 == tags2 {
// heuristic: our closure defunctionalization scheme generates a bunch of one-tag unions
// also our number types fall in this category too.
if tags1.len() == 1
&& tags2.len() == 1
&& tags1 == tags2
&& subs.get_content_without_compacting(rec1.ext)
== subs.get_content_without_compacting(rec2.ext)
{
return unify_shared_tags_merge(subs, ctx, tags1, rec1.ext, recursion_var);
}