anchor.diff:        let env = List.fold (fun env (x, t) -> push_id env x t) env xs in
         let (t, ae) = infer_exp env u e None in
         let ae = AE_Bind (Lambda, [], List.map (fun (x, t) -> (x, Some t)) xs, ts, ae) in
  -      norm_ret (TFun (List.map snd xs, t)) ae
  +      ret (TFun (List.map snd xs, t)) ae
     | ECast (e, tc) ->
         let (t, ae) = infer_exp env u e None in
         let ae = AE_Cast (ae, tc) in
  -      norm_ret tc ae
  +      ret tc ae
         //REVIEW: casts across arbitrary types seem to be useful (e.g. for module friends)
         //// TODO: move this check to after inference:
         //if (is_subtype env t tc_norm || is_subtype env tc_norm t) then norm_ret tc ae
  
positive.code:     // TODO: type inference here
      let (_, tr, _, _, _) = ret in
      let check_subtype (x:id) (tx:typ):unit =
        if not (is_subtype_norm env tr tx) then err (sprintf "cannot assign return type '%s' to variable '%s' of type '%s'" (string_of_typ tr) (err_id x) (string_of_typ tx))
        in
      match lhs with
      | (x, None) -> check_subtype x (assign_local env x); lhs
  
negative.code:     let coerce =
        match expected_typ with
        | None -> None
        | Some et -> if typ_equal env t et then None else Some (t, et)
        in
      u_constrain_subtype_opt u t expected_typ;
      (t, (ae, coerce))
      in
    let check_collection_literal (x:id) (pt:primitive_type) (ts_opt:typ list option) (es:exp list) =
      let tv = u_next_type_var u in
  