This site is updated infrequently. For up-to-date information, please visit the new OCaml website at ocaml.org.

[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 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

```