anchor.diff:  let eta_expand (t : mlty) (e : mlexpr) : mlexpr =
       let ts, r = doms_and_cod t in
       if ts = [] then e else // just quit if this is not a function type
  -    let vs = List.map (fun _ -> "a") ts in
  +    let vs = List.map (fun _ -> fresh ("a")) ts in
       let vs_ts = List.zip vs ts in
       let vs_es = List.map (fun (v, t) -> with_ty t (MLE_Var v)) (List.zip vs ts) in
       let body = with_ty r <| MLE_App (e, vs_es) in
  
positive.code:     | MLE_TApp (h, _) -> is_ml_value h
      | _ -> false
  
  
  //pre-condition: SS.compress t = Tm_abs _
  //Collapses adjacent abstractions into a single n-ary abstraction
  
negative.code:         | Tm_arrow (binders, _) ->
              binders
              |> List.filter (function (_, (Some (Implicit _))) -> true | _ -> false)
              |> List.map (fun _ -> fresh "_", MLTY_Top)
          | _ ->
              failwith "Discriminator must be a function"
      in
      // Unfortunately, looking up the constructor name in the environment would give us a _curried_ type.
      // So, we don't bother popping arrows until we find the return type of the constructor.
      // We just use Top.
      let mlid = fresh "_discr_" in
      let targ = MLTY_Top in
      // Ugly hack: we don't know what to put in there, so we just write a dummy
      // polymorphic value to make sure that the type is not printed.
  