Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Easy solution in OCaml?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: sebastien FURIC <sebastien.furic@t...>
Subject: Re: [Caml-list] Easy solution in OCaml?
 Hi Siegfried,

 I wrote the following Ocaml program that performs the task using
functors.
 The "interresting stuff" is in module Means: It computes the means
given rules you define into the NUMERICTYPE module you pass to the
functor. As you can see, there is no need to change the code even if you
change your numeric type or the meaning of is_nan, zero, one, + and /.

 module type NUMERICTYPE =
  sig
     type t
     val is_nan: t -> bool
     val zero: t
     val one: t
     val ( + ): t -> t -> t
     val ( / ): t -> t -> t
   end

 module type MEANS =
  sig
    type t
    val quarterly_means: t list -> t * t * t * t
  end

 module Means(NumericType : NUMERICTYPE) : (MEANS with type t =
NumericType.t) =
  struct
    open NumericType
    type t = NumericType.t
    let mean xs =
      let rec mean' sum n = function
        | [] -> sum / n
        | x :: xs when is_nan x -> mean' sum n xs
        | x :: xs -> mean' (sum + x) (n + one) xs
      in mean' zero zero xs
    let quarterly_means = function
      | [a; b; c; d; e; f; g; h; i; j; k; l] ->
        mean [a; b; c], mean [d; e; f], mean [g; h; i], mean [j; k; l]
      | _ -> failwith "quarterly_means: 12 months expected"
  end

(* tests *)
module Integer =
  struct
     type t = int
     let is_nan i = i = -1
     let zero = 0
     let one = 1
     let ( + ) = ( + )
     let ( / ) = ( / )
   end
;;

module Float =
  struct
     type t = float
     let is_nan f = classify_float f = FP_nan
     let zero = 0.0
     let one = 1.0
     let ( + ) = ( +. )
     let ( / ) = ( /. )
   end
;;

module MeansInteger = Means(Integer);;
MeansInteger.quarterly_means
  [1; 2; 4; -1; 45; 56; 45; 56; 8; 10; 30; 5];;

module MeansFloat = Means(Float);;
MeansFloat.quarterly_means
  [1.0; 2.0; 4.0; 0.0 /. 0.0; 45.0; 56.0; 45.0; 56.0; 8.0; 10.0; 30.0;
5.0];;

 Cheers,

 Sébastien.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners