sig
  exception Different_dimensions of int * int
  module type Dimension = sig val length : int end
  module type V =
    sig
      type t
      val dimension : int
      val get : Vector.V.t -> int -> float
      val set : Vector.V.t -> int -> float -> unit
      val make : float -> Vector.V.t
      val from_array : float array -> Vector.V.t
      val to_array : Vector.V.t -> float array
      val add : Vector.V.t -> Vector.V.t -> Vector.V.t
      val sub : Vector.V.t -> Vector.V.t -> Vector.V.t
      val mul : Vector.V.t -> Vector.V.t -> Vector.V.t
      val muls : Vector.V.t -> float -> Vector.V.t
      val dot_product : Vector.V.t -> Vector.V.t -> float
      val magnitude : Vector.V.t -> float
      val unit_vector : Vector.V.t -> Vector.V.t
    end
  module Make : functor (Dim : Dimension-> V
  module DimThree : Dimension
  module Three : V
  val cross_product : Three.t -> Three.t -> Three.t
end