caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Re: type recursifs et abreviations cyclique and Co
@ 1997-11-25 11:30 Cuoq Pascal
  0 siblings, 0 replies; 3+ messages in thread
From: Cuoq Pascal @ 1997-11-25 11:30 UTC (permalink / raw)
  To: caml-list


Jason Hickey wrote :

> 2.  The policy imposes a needless efficiency penalty on type
>     abstraction.  
>  [...]
>     ocaml will insert an extraneous boxing for each
>     occurrence of an item of type x in t.  Consider an unlabeled
>     abstract binary tree:
> 
>         type 'a t = ('a option) * ('a option)    (* abstract *)
>         ...
>         type node = X of node t
> 
>     Every node is boxed, with a space penalty that is
>     linear in the number of nodes.

It seems to me that this is an argument for adding an optimization to
ocaml, not to change the typechecking algorithm :)

Pascal





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: type recursifs et abreviations cyclique and Co
@ 1997-11-25  4:40 Jason Hickey
  0 siblings, 0 replies; 3+ messages in thread
From: Jason Hickey @ 1997-11-25  4:40 UTC (permalink / raw)
  To: caml-list
  Cc: crary, hayden, Olivier Montanuy, Emmanuel Engel, Jerome Vouillon,
	Francisco Valverde

Although my French is not what I would like, I gather that the feature
of general recursive types in OCaml has been drawn back because it is
prone to error.  For instance, the type I originally proposed

    type x = x option

is not allowed because types of that form are prone to error.  The
solution would be to apply an explicit boxing:

    type x = X of x option.

I would like to make an argument against this policy.

1.  The interpretation of the general recursive type has a
    well-defined type theoretic meaning.  For instance, the type

        type x = x option

    is isomorphic to the natural numbers.  The _type_theory_ does not
    justify removing it from the language.  Why not issue a warning rather
    than forbidding the construction?  For instance, the following code is
    not forbidden:

        let flag = (match List.length [] with 0 -> true)

    even though constructions of this form are "prone to error,"
    and generate warning messages.

2.  The policy imposes a needless efficiency penalty on type
    abstraction.  For instance, suppose we have an abstract type

        type 'a t

    then we can't form the recursive type

        type x = x t

    without a boxing.  Although the type

        type x = X of x t

    is equivalent, it requires threading a lot of superfluous X's through
    the code, and ocaml will insert an extraneous boxing for each
    occurrence of an item of type x in t.  Consider an unlabeled
    abstract binary tree:

        type 'a t = ('a option) * ('a option)    (* abstract *)
        ...
        type node = X of node t

    Every node is boxed, with a space penalty that is
    linear in the number of nodes.

3.  If the type system can be bypassed with an extraneous boxing,

        type x = x t   ----->   type x = X of x t

    then what is the point?

4.  (Joke) All significant programs are "prone to error."  Perhaps the
    OCaml compiler should forbid them all!

    I use this construction extensively in Nuprl (theorem proving)
    and Ensemble (communications) applications; do I really need
    to change my code?

Jason






^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: type recursifs et abreviations cyclique and Co
  1997-11-21 14:38 Patch "shared-vm" for ocaml-1.06 Fabrice Le Fessant
@ 1997-11-21 18:26 ` Emmanuel Engel
  0 siblings, 0 replies; 3+ messages in thread
From: Emmanuel Engel @ 1997-11-21 18:26 UTC (permalink / raw)
  To: caml-list

D'une facon generale, je ne  pense pas que le  fait  de ne pas  pouvoir
ecrire de type cyclique enleve quelque chose. Une abreviation cyclique
definit en  fait  une instance  recursive  d'un type qui  n'etait  pas
necessairement recursif depuis le debut. Ainsi la definition de type

type x = x option 

doit "moralement" etre equivalente au type 

'a option as 'a

Le fait que caml interdise de tels (definitions de) types me semble une
bonne chose, les erreurs de typage  en presence des  types de la forme
"'a t as 'a"  sont vraiement difficiles a  trouver. De plus, il me
semble
que cela n'enleve   rien.  Par exemple  la definition   precedente est
equivalente (en tout cas a premiere vue) a

type x = None | Some of x;;

Si vraiement je veu utiliser les options,  je peut toujours introduire
une constructeur bidon qui va masquer l'abreviation cyclique:

type x = X of x option;;

Le second mail porte exactement sur le meme probleme.  Le principe est
que tout  type recursifs ('a t as  'a) doit pouvoir etre redefini sous
une forme equivalente sans avoir  besoin de "as".   J'ai bien peur que
le second exemple soit plus  difficile.  Pour simplifier, j'ai mis  la
module a  plat, sans HALF.  De plus  include n'existe  pas (suivant la
doc)

Voici le point de depart.

module type Pre =
  sig
    type ('a, 'b) h_label = | Lexicalized of 'a | Built of 'b
    type ('a, 'b) h_unit = ('a, 'b) h_label option
    type ('a, 'b, 'c) node =
      	{ mutable parent: ('a, 'b, 'c) node option;
          mutable forest: ('a, 'b, 'c) node list;
          mutable state: 'b;
          mutable unit: ('a, 'c) h_unit
	} 
	  
	  
    type p_state
    and s_state
    and p_label
    and s_label
	  
    and p = (p_label, p_state, s) Half.node
    and s = (s_label, s_state, p) Half.node
  end;; 

J'ai deux  solutions.  Le premiere est en  fait  de definir deux types
"node" differents, un par instance consideree. Cela donne plus ou moins

module type Pre =
  sig
    type ('a, 'b) h_label = | Lexicalized of 'a | Built of 'b
    type ('a, 'b) h_unit = ('a, 'b) h_label option
    type node_p =
      	{ mutable parent: node_p option;
          mutable forest: node_p list;
          mutable state: p_state;
          mutable unit: (p_label, node_s) h_unit
	} 
	  
    and node_s =
	{ mutable parent: node_s option;
          mutable forest: node_s list;
          mutable state: s_state;
          mutable unit: (s_label, node_p) h_unit
	}
	  
    and p_state
    and s_state
    and p_label
    and s_label
	  
    type p = node_p
    and s = node_s
  end;; 


Je suis d'accord c'est lourd, de plus les fonctions 

val leq_cost : ('a, 'b, 'c) node -> ('a, 'b, 'c) node -> bool
val leq_p_cost : p -> p -> bool
val leq_s_cost : s -> s -> bool
val p_block : p -> unit
val s_block : s -> unit

doivent  etre  dupliquees.   L'autre  solution   est   le constructeur
bidon. Cela donne


module type Pre =
  sig
    type ('a, 'b) h_label = | Lexicalized of 'a | Built of 'b
    type ('a, 'b) h_unit = ('a, 'b) h_label option
    type ('a, 'b, 'c) node =
      	{ mutable parent: ('a, 'b, 'c) node option;
          mutable forest: ('a, 'b, 'c) node list;
          mutable state: 'b;
          mutable unit: ('a, 'c) h_unit
	} 
	  
	  
    and p_state
    and s_state
    and p_label
    and s_label
	  
    and p = P of (p_label, p_state, s) node
    and s = S of (s_label, s_state, p) node
  end;; 


Hope this help.


-- 

- Emmanuel Engel





^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~1997-11-26  9:56 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1997-11-25 11:30 type recursifs et abreviations cyclique and Co Cuoq Pascal
  -- strict thread matches above, loose matches on Subject: below --
1997-11-25  4:40 Jason Hickey
1997-11-21 14:38 Patch "shared-vm" for ocaml-1.06 Fabrice Le Fessant
1997-11-21 18:26 ` type recursifs et abreviations cyclique and Co Emmanuel Engel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).