functor
  (M : sig
         type 'a t
         type key
         val equal :
           ('-> '-> bool) ->
           'Linear.RingMap.t -> 'Linear.RingMap.t -> bool
         val compare :
           ('-> '-> int) ->
           'Linear.RingMap.t -> 'Linear.RingMap.t -> int
         val enum :
           'Linear.RingMap.t -> (Linear.RingMap.key * 'a) BatEnum.t
         val map : ('-> 'b) -> 'Linear.RingMap.t -> 'Linear.RingMap.t
         val find : Linear.RingMap.key -> 'Linear.RingMap.t -> 'a
         val add :
           Linear.RingMap.key ->
           '-> 'Linear.RingMap.t -> 'Linear.RingMap.t
         val remove :
           Linear.RingMap.key -> 'Linear.RingMap.t -> 'Linear.RingMap.t
         val empty : 'Linear.RingMap.t
         val merge :
           (Linear.RingMap.key -> 'a option -> 'b option -> 'c option) ->
           'Linear.RingMap.t -> 'Linear.RingMap.t -> 'Linear.RingMap.t
       end) (R : Ring->
  sig
    type t = R.t M.t
    type dim = M.key
    type scalar = R.t
    val equal : t -> t -> bool
    val add : t -> t -> t
    val scalar_mul : scalar -> t -> t
    val negate : t -> t
    val sub : t -> t -> t
    val dot : t -> t -> scalar
    val zero : t
    val is_zero : t -> bool
    val add_term : scalar -> dim -> t -> t
    val of_term : scalar -> dim -> t
    val enum : t -> (scalar * dim) BatEnum.t
    val of_enum : (scalar * dim) BatEnum.t -> t
    val of_list : (scalar * dim) list -> t
    val coeff : dim -> t -> scalar
    val pivot : dim -> t -> scalar * t
  end