sig
  type op2 = Plus | Minus | Times | Div | Pow
  type op1 = Func of (float -> float) | MinusUn
  type 'a t =
      Float of float
    | Op2 of 'Calc.t * Calc.op2 * 'Calc.t
    | Op1 of Calc.op1 * 'Calc.t
    | Var of 'a
  module Env :
    sig
      type t
      val add : string -> float -> Calc.Env.t -> Calc.Env.t
      val mem : string -> Calc.Env.t -> bool
      val union : Calc.Env.t -> Calc.Env.t -> Calc.Env.t
      val of_list : (string * float) list -> Calc.Env.t
      val empty : Calc.Env.t
      val usual : Calc.Env.t
    end
  exception Unknown_variable of string
  val eval : Calc.Env.t -> string Calc.t -> float
  val compress : Calc.Env.t -> string Calc.t -> string Calc.t
  val eval_custom : ('-> float) -> 'Calc.t -> float
  val compress_custom : ('-> float option) -> 'Calc.t -> 'Calc.t
  val bind : ('-> 'Calc.t) -> 'Calc.t -> 'Calc.t
  val bind_opt : ('-> 'Calc.t option) -> 'Calc.t -> 'Calc.t
  val fold : ('-> '-> 'b) -> 'Calc.t -> '-> 'b
  val map : ('-> 'b) -> 'Calc.t -> 'Calc.t
  val iter :
    ?var:('-> unit) ->
    ?float:(float -> unit) ->
    ?op1:(Calc.op1 -> unit) -> ?op2:(Calc.op2 -> unit) -> 'Calc.t -> unit
  val vars : 'Calc.t -> ('-> unit) -> unit
  val closure :
    ?env:Calc.Env.t ->
    string Calc.t -> (string * 'a) list -> ('-> float) -> float
end