From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id RAA30431; Tue, 17 Aug 2004 17:13:08 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f 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 RAA28883 for ; Tue, 17 Aug 2004 17:13:07 +0200 (MET DST) Received: from quick.recoil.org (quick.recoil.org [194.70.3.133]) by nez-perce.inria.fr (8.12.10/8.12.10) with SMTP id i7HFD6mL012398 for ; Tue, 17 Aug 2004 17:13:07 +0200 Received: (qmail 13660 invoked by uid 10000); 17 Aug 2004 15:13:06 -0000 Date: Tue, 17 Aug 2004 16:13:06 +0100 From: Anil Madhavapeddy To: Richard Jones Cc: Caml Mailing List Subject: Re: [Caml-list] Are map and iter guaranteed to be called in forwards order? Message-ID: <20040817151306.GA13946@quick.recoil.org> References: <20040817120053.GA9749@annexia.org> <20040817145653.GA12345@annexia.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040817145653.GA12345@annexia.org> User-Agent: Mutt/1.4.2i X-Miltered: at nez-perce with ID 41222082.002 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 2004:99 'g':01 val:01 char:01 'g':01 val:01 incr:01 char:01 int:01 int:01 rec:01 match:02 wrote:03 explicitly:03 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk On Tue, Aug 17, 2004 at 03:56:53PM +0100, Richard Jones wrote: > This came up because I wanted a sensible way to number a list of > items. The obvious imperative approach is: > > # let items = ['a';'c';'e';'g';'i'];; > val items : char list = ['a'; 'c'; 'e'; 'g'; 'i'] > # let i = ref 0;; > val i : int ref = {contents = 0} > # let items = List.map (fun item -> let n = !i in incr i; n, item) items;; > val items : (int * char) list = > [(0, 'a'); (1, 'c'); (2, 'e'); (3, 'g'); (4, 'i')] > > The functional approach is comparatively long-winded: you have to > effectively write your own loop explicitly, and the obvious way to > write it isn't tail recursive, so you have to do it with accumulators. > Would List.combine come in handy? Something like: # let rec numlist n a = match n with |0 -> a |x -> numlist (n-1) (x::a);; val numlist : int -> int list -> int list = # let number l = List.combine (numlist (List.length l) []) l;; val number : 'a list -> (int * 'a) list = # let items = ['a';'c';'e';'g';'i'];; val items : char list = ['a'; 'c'; 'e'; 'g'; 'i'] # number items;; - : (int * char) list = [(1, 'a'); (2, 'c'); (3, 'e'); (4, 'g'); (5, 'i')] -- Anil Madhavapeddy http://anil.recoil.org University of Cambridge http://www.cl.cam.ac.uk ------------------- 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