sig
  type elt = float
  type ('a, 'b) t = (elt, 'a, 'b) array_ constraint 'b = [< `R | `W ]
  val add :
    ?res:('a, [< `R | `W > `W ] as 'b) t ->
    ('a, [< `R | `W > `R ]) t -> ('a, [< `R | `W > `R ]) t -> ('a, 'b) t
  val mult :
    ?res:('a, [< `R | `W > `W ] as 'b) t ->
    ('a, [< `R | `W > `R ]) t -> ('a, [< `R | `W > `R ]) t -> ('a, 'b) t
  val scalar_add :
    ?res:('a, [< `R | `W > `W ] as 'b) t ->
    ('a, [< `R | `W > `R ]) t -> x:elt -> ('a, 'b) t
  val scalar_mult :
    ?res:('a, [< `R | `W > `W ] as 'b) t ->
    ('a, [< `R | `W > `R ]) t -> x:elt -> ('a, 'b) t
  val sum_elt : ('a, [< `R | `W > `R ]) t -> elt
  val product_elt : ('a, [< `R | `W > `R ]) t -> elt
  val dot_product :
    ('a, [< `R | `W > `R ]) t -> ('b, [< `R | `W > `R ]) t -> elt
  module Infix :
    sig
      val ( * ) :
        ('a, [< `R | `W > `R ]) t ->
        ('a, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
      val ( + ) :
        ('a, [< `R | `W > `R ]) t ->
        ('b, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
      val ( *! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
      val ( +! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
    end
  val ( * ) :
    ('a, [< `R | `W > `R ]) t ->
    ('a, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
  val ( + ) :
    ('a, [< `R | `W > `R ]) t ->
    ('b, [< `R | `W > `R ]) t -> ('a, [< `R | `W ]) t
  val ( *! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
  val ( +! ) : ('a, [< `R | `W > `R ]) t -> elt -> ('a, [< `R | `W ]) t
end