* Typage des modules
@ 1999-06-22 15:38 Daniel Bonniot
1999-06-23 13:19 ` Sylvain BOULM'E
1999-06-23 17:00 ` David Monniaux
0 siblings, 2 replies; 3+ messages in thread
From: Daniel Bonniot @ 1999-06-22 15:38 UTC (permalink / raw)
To: caml-list
Bonjour,
Comment resoudre le probleme suivant ?
Le module A declare un type a, le module B renvoie une valeur de type a
et A utilise B dans son implementation :
(* a.mli *)
type a
val v:a
(* a.ml *)
type a = { x: int}
let v = B.f {x=3}
(* b.mli *)
val f : A.a-> A.a
(* b.ml *)
let f x =x
Voici le resultat des compilations:
moo>ls
a.ml a.mli b.ml b.mli
moo>ocamlc -c a.mli
moo>ocamlc -c b.mli
moo>ocamlc -c a.ml
File "a.ml", line 2, characters 12-17:
This expression has type a but is here used with type A.a
moo>
Cette erreur est logique etant donne le systeme de typage des modules,
mais comment ecrire ce genre de dependances ?
Daniel Bonniot
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Typage des modules
1999-06-22 15:38 Typage des modules Daniel Bonniot
@ 1999-06-23 13:19 ` Sylvain BOULM'E
1999-06-23 17:00 ` David Monniaux
1 sibling, 0 replies; 3+ messages in thread
From: Sylvain BOULM'E @ 1999-06-23 13:19 UTC (permalink / raw)
To: Daniel Bonniot; +Cc: caml-list
Bonjour,
Pour repondre a votre question, il y a plusieurs solutions... La "meilleure"
depend du probleme que vous avez a resoudre :
1. Le polymorphisme de OCAML
Dans "b.mli", vous declarez
val f: 'a -> 'a
Si f utilise en fait des fonctions de "a.ml", vous passez ces fonctions en
parametres de f. Cette methode devient vite penible si vous avez en fait
plusieurs fonctions "f" qui dependent de plusieurs fonctions de "a.ml"
2. Dans ce cas, vous pouvez utilisez le mecanisme de foncteur de OCAML.
Par exemple :
module type B_Type =
sig
type t
val f: t->t
end
module MakeB (A: sig type a val g: a->a end) : B_Type with type t=A.a =
struct
type t=A.a
let f x = (A.g x)
end
module type A_Type =
sig
type a
module B : B_Type with type t=a
val v: a
val g: a -> a
end
module A: A_Type =
struct
type b = { x:int}
type a = b
let g x = x
module B = MakeB (struct type a = b let g=g end)
let v = B.f {x=3}
end
module B = MakeB (A)
Dans cet exemple vous pouvez evidemment faire de "A_Type" un "a.mli", et de
"A" un "a.ml". Mais ce mecanisme devient penible quand les dependences se
compliquent (avec eventuellement des definitions de B et de A mutuellement
recursives) : dans ce cas, soit on peut revoir son decoupage en "module" (deux
fonctions mutuellement recursives devraient peut-etre appartenir au meme
module), soit on peut utiliser les mecanismes objets.
3.
class virtual ['a] a_type =
object
method virtual stop: 'a -> bool
method virtual v: 'a
method virtual g: 'a -> 'a
end
class ['b] b_class (o:'b) =
object
constraint 'b = 'a #a_type
method f x=
if (o#stop x)
then o#v
else (o#g x)
end
module type A_Type =
sig
type a
val obj : a a_type
val p: a -> string
end
module A: A_Type =
struct
type a={x : int}
class a_class =
object (s)
inherit [a] a_type
method b = new b_class s
method stop y = y.x <= 0
method v = s#b#f {x=3}
method g y =
if (s#stop y) then (s#b#f y) else { x= y.x-5 }
end
let obj = (new a_class :> a a_type)
let p y = string_of_int y.x
end;;
let obj_b = new b_class A.obj;;
J'espere que vous trouverez ce que vous cherchez,
Sylvain.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Typage des modules
1999-06-22 15:38 Typage des modules Daniel Bonniot
1999-06-23 13:19 ` Sylvain BOULM'E
@ 1999-06-23 17:00 ` David Monniaux
1 sibling, 0 replies; 3+ messages in thread
From: David Monniaux @ 1999-06-23 17:00 UTC (permalink / raw)
To: Liste CAML
On Tue, 22 Jun 1999, Daniel Bonniot wrote:
> Cette erreur est logique etant donne le systeme de typage des modules,
> mais comment ecrire ce genre de dependances ?
For our English-speaking friends: I've already had the same kind of
problem as Daniel's. When the compiler compiles a.ml to produce module A,
it doesn't see that A.a and a are the same thing, which leads to absurd
typing errors. It's sometimes unpleasant.
-- David
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~1999-06-23 19:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-06-22 15:38 Typage des modules Daniel Bonniot
1999-06-23 13:19 ` Sylvain BOULM'E
1999-06-23 17:00 ` David Monniaux
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox