anchor.diff:  (* -------------------------------------------------------------------- *)
   (* A table to remember the names of the fields of constructors *)
   let record_constructors = smap_create<list<ident>>(17)
  +(* A table to remember the arity of algebraic constructors *)
  +let algebraic_constructors = smap_create<int>(40)
   
   (* -------------------------------------------------------------------- *)
   let rec mlpat_of_pat (mlenv : mlenv) (rg : range) (le : lenv) (p : pat) : lenv * mlpattern =
  
positive.code:     | (RecordType f)::_ -> Some f
      | _::qualif -> getRecordFieldsFromType qualif in
  
      let (ts, cs) =
          let fold1 sigelt (types, ctors) =
              match sigelt with
  
negative.code:     let rg = e.pos in
      let e = Absyn.Util.compress_exp e in
  
      let rec eta_expand_dataconst ct args nvars =
        let ctr = mk_ref 0 in
        let rec bvs = function
          | 0 -> []
          | n -> incr ctr; (("__dataconst_"^(Util.string_of_int !ctr)), !ctr) :: (bvs (n-1)) in
        let vs = bvs nvars in
        let fapp = MLE_CTor (ct, args @ (List.map (fun x -> MLE_Var(x)) vs)) in
        MLE_Fun(vs, fapp)
      in
  
      let mkCTor c args =
        match smap_try_find record_constructors c.ident.idText with
          | Some f -> MLE_Record (path_of_ns mlenv c.ns, List.zip (List.map (fun x -> x.idText) f) args)
          | None ->
            begin
              match smap_try_find algebraic_constructors c.ident.idText with
              | Some n when n > List.length args -> eta_expand_dataconst (mlpath_of_lident mlenv c) args (n-List.length args)
              | _ -> MLE_CTor (mlpath_of_lident mlenv c, args)
            end
        in
  
      match e.n with
      | Exp_app(sube, args) ->
  