From bd1eb36503aa6e03532fefcfd0c4f27eb62c99d2 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 24 Jan 2020 16:29:25 +0000 Subject: Restore all types in Value::to_tyexpr --- dhall/src/semantics/phase/normalize.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'dhall/src/semantics/phase/normalize.rs') diff --git a/dhall/src/semantics/phase/normalize.rs b/dhall/src/semantics/phase/normalize.rs index 75d61d5..8f3953d 100644 --- a/dhall/src/semantics/phase/normalize.rs +++ b/dhall/src/semantics/phase/normalize.rs @@ -71,6 +71,7 @@ pub(crate) fn apply_builtin( b: Builtin, args: Vec, ty: &Value, + types: Vec, ) -> ValueKind { use syntax::Builtin::*; use ValueKind::*; @@ -364,7 +365,7 @@ pub(crate) fn apply_builtin( } v.to_whnf_check_type(ty) } - Ret::DoneAsIs => AppliedBuiltin(b, args), + Ret::DoneAsIs => AppliedBuiltin(b, args, types), } } @@ -377,10 +378,15 @@ pub(crate) fn apply_any(f: Value, a: Value, ty: &Value) -> ValueKind { ValueKind::LamClosure { closure, .. } => { closure.apply(a).to_whnf_check_type(ty) } - ValueKind::AppliedBuiltin(b, args) => { + ValueKind::AppliedBuiltin(b, args, types) => { use std::iter::once; let args = args.iter().cloned().chain(once(a.clone())).collect(); - apply_builtin(*b, args, ty) + let types = types + .iter() + .cloned() + .chain(once(f.get_type().unwrap())) + .collect(); + apply_builtin(*b, args, ty, types) } ValueKind::UnionConstructor(l, kts, uniont) => ValueKind::UnionLit( l.clone(), @@ -631,7 +637,7 @@ pub(crate) fn normalize_one_layer( ExprKind::SomeLit(e) => Ret::ValueKind(NEOptionalLit(e)), ExprKind::EmptyListLit(t) => { let arg = match &*t.as_whnf() { - ValueKind::AppliedBuiltin(syntax::Builtin::List, args) + ValueKind::AppliedBuiltin(syntax::Builtin::List, args, _) if args.len() == 1 => { args[0].clone() @@ -806,7 +812,9 @@ pub(crate) fn normalize_whnf( ty: &Value, ) -> ValueKind { match v { - ValueKind::AppliedBuiltin(b, args) => apply_builtin(b, args, ty), + ValueKind::AppliedBuiltin(b, args, types) => { + apply_builtin(b, args, ty, types) + } ValueKind::PartialExpr(e) => normalize_one_layer(e, ty), ValueKind::TextLit(elts) => { ValueKind::TextLit(squash_textlit(elts.into_iter())) -- cgit v1.2.3