diff options
author | Nadrieril | 2020-01-25 13:51:24 +0000 |
---|---|---|
committer | Nadrieril | 2020-01-25 13:52:08 +0000 |
commit | 574fb56e87c1a71dc8d7efbff2789d3cfabdc529 (patch) | |
tree | cd425a1cb351eee7f3d412a7da0cadf4e552fc31 /dhall/src/semantics/phase/normalize.rs | |
parent | 8c64ae33149db4edaaa89d2d187baf10a2b9f8bf (diff) |
More typecheck
Diffstat (limited to '')
-rw-r--r-- | dhall/src/semantics/phase/normalize.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/dhall/src/semantics/phase/normalize.rs b/dhall/src/semantics/phase/normalize.rs index 7f547d7..33e1f2b 100644 --- a/dhall/src/semantics/phase/normalize.rs +++ b/dhall/src/semantics/phase/normalize.rs @@ -595,8 +595,23 @@ fn apply_binop<'a>( Ret::ValueKind(RecordLit(kvs)) } - (RecursiveRecordTypeMerge, _, _) => { - unreachable!("This case should have been handled in typecheck") + (RecursiveRecordTypeMerge, RecordType(kts_x), RecordType(kts_y)) => { + let kts = merge_maps::<_, _, _, !>( + kts_x, + kts_y, + // If the Label exists for both records, then we hit the recursive case. + |_, l: &Value, r: &Value| { + Ok(Value::from_kind_and_type( + ValueKind::PartialExpr(ExprKind::BinOp( + RecursiveRecordTypeMerge, + l.clone(), + r.clone(), + )), + ty.clone(), + )) + }, + )?; + Ret::ValueKind(RecordType(kts)) } (Equivalence, _, _) => { |