New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
modules_récursifs #8187
Comments
Comment author: administrator Bonjour,
C'est corrigé. Merci de l'avoir signalé.
Ce n'est pas vraiment spécifique aux variantes: il y a des limitations
Dans les deux cas, on essaye d'utiliser "trop tôt" une composante des
On peut donner des signatures (récursives) à des modules récursifs, module type SIGM2 = sig val f : #M1.o -> bool end "M1" ne ferait référence à rien.
Le typage et la compilation d'un module récursif sont assez différents Très cordialement,
|
Comment author: administrator Fixed 2003-06-26 by XL. |
Comment author: administrator On Thu, 26 Jun 2003, Jacques Garrigue wrote:
Ces solution sont peut être plus simple du point de vue du compilateur,
Je trouve ce code beaucoup plus clair que le même avec la paramétrisation module rec M
Dans le cas des classes, je ne vois pas comment contourner : module rec M : |
Comment author: administrator From: lvibert@irisa.fr Je n'avais pas testé les modules récursifs jusqu'à présent, donc je
En effet, pour les types de classes et de variants il faudrait la À noter que
Il me semble que les modules recursifs répondent à un problème
type f = {f:'a. 'a -> unit} Et ça pourrait se faire plus directement dans le core-language si on
class c = object (self) method c = (self :> c) end Donc il ne me semble pas gênant que les modules récursifs aient un Quand à comprendre le module courant comme récursif dans les .mli, ça À noter que les seuls avantages des modules sur les records à champs
|
Comment author: administrator From: Laurent Vibert lvibert@irisa.fr
Ah bon. Pourtant il me semble qu'on écrit exactement les mêmes
type 'c t0 = A of int | B of 'c C'est plus court. Mais peut-être pas très intuitif, je l'admets. C'est Et si il est permis d'écrire explicitement le type de la classe, on type t = A of int | B of c_t En fait je crois que le découplage des classes et type de classes est type t = A of int | B of c_t Plus propre que les alternatives, non?
Tel quel ton exemple ne peut pas marcher: il ne peut pas y avoir de let c = new M.c 1;;val c : int M.c = c#map;;
Je sens un invariant cassé dans les modules récursifs... type 'a c0 = C of < map : 'b. ('a -> 'b) -> 'b c0 > type m = {mutable new_c : 'a. 'a -> 'a c0} class ['a] c (x : 'a) = object C'est pas beau...
|
Original bug ID: 1730
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
Bonjour,
après avoir testé les modules récursifs, je suis tombés sur un bug et
quelques limitations :
type checker crash :
cafe[15:21]%cat tmp.mli
module rec M1 : sig
class o : object end
end
and M2 : sig
val f : #M1.o -> bool
end
cafe[15:21]%ocamlc tmp.mli
Fatal error: exception Assert_failure("typing/typetexp.ml", 275, 10)
les modules récursifs ne se marient pas bien avec les variantes
polymorphes :
module rec M1 : sig
type t = [
A |
B ]end
and M2 : sig
val f : [> M1.t ] -> bool
type t = [ M1.t | `C ]
end
une autre limitation est l'impossibilité de définir des signatures
récursives. Est-ce une limitation technique, ou un oubli ?
Enfin un voeux pour l'avenir : les modules récursifs appliqués à un seul
module permettent de contourner des limitations du système de type
actuel :
signature correspondante !),
Je me demandait donc si en cas de présence d'un fichier .mli, le
compilateur pourrait comprendre le module courant comme récursif pour
éviter une encapsulation supplémentaire, en réservant alors un mot clé
(Rec ? Self ?) pour désigner le module.
The text was updated successfully, but these errors were encountered: