From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id IAA04626 for caml-redistribution; Tue, 14 Jan 1997 08:46:47 +0100 (MET) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id MAA19479 for ; Mon, 13 Jan 1997 12:41:35 +0100 (MET) Received: from taloa.unice.fr ([134.59.1.7]) by nez-perce.inria.fr (8.7.6/8.7.3) with SMTP id MAA10794 for ; Mon, 13 Jan 1997 12:41:33 +0100 (MET) Received: from mad.unice.fr.noname (mad.unice.fr [134.59.10.81]) by taloa.unice.fr (8.6.12/8.6.12) with SMTP id MAA20837; Mon, 13 Jan 1997 12:43:42 +0100 Received: from mad (localhost) by mad.unice.fr.noname (4.1/SMI-4.1) id AA03787; Mon, 13 Jan 97 12:41:14 +0100 Message-Id: <32DA1F59.41C67EA6@mad.unice.fr> Date: Mon, 13 Jan 1997 12:41:13 +0100 From: Eric HASSOLD X-Mailer: Mozilla 3.0Gold (X11; I; SunOS 4.1.4 sun4m) Mime-Version: 1.0 To: David Monniaux Cc: Caml-list Subject: Re: bizarrerie du typage References: Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Sender: weis David Monniaux wrote: > > J'ai un exemple assez amusant de bizarreries du typage: > > Objective Caml version 1.01 > > #let zero = fun x y -> y;; > val zero : 'a -> 'b -> 'b = > #let succ = fun n f x -> n f (f x);; > val succ : (('a -> 'b) -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = > #let un = succ zero;; > val un : ('_a -> '_b) -> '_a -> '_b = > #let deux = succ un;; > val deux : ('_a -> '_a) -> '_a -> '_a = > #deux (fun x -> x) 0;; > - : int = 0 > #deux;; > - : (int -> int) -> int -> int = > le symbole _ dans le type ('_a et non 'a) indique qu'il s'agit d'un type statique qui doit cependant attendre le premier appel de la fonction pour etre resolu et assigne definitivement (le type int dans ton exemple). Si tu veux preserver le polymorphisme des fonctions un et deux, declare les arguments explicitement, c-a-d let un = fun f x -> succ zero f x;; val un : ('a -> 'b) -> 'a -> 'b = let deux = fun f x -> succ un f x;; val deux : ('a -> 'a) -> 'a -> 'a = Alors, tu obtiens bien : deux (fun x -> x) 0;; - : int = 0 mais toujours deux;; - : ('a -> 'a) -> 'a -> 'a = > "Si l'informatique marchait, cela se saurait." Je trouve que ca se sait... ----- Eric Hassold Université de Nice - Sophia Antipolis Laboratoire de Mathématiques Parc Valrose 06108 Nice Cedex 02 - France Téléphone : (33) 04 92 07 62 89 Email : hassold@mad.unice.fr WWW : http://math.unice.fr/~hassold