From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by walapai.inria.fr (8.13.6/8.13.6) with ESMTP id p8ELibmG005486 for ; Wed, 14 Sep 2011 23:44:37 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIAAPUfcU7RVdK2mGdsb2JhbABChFWUCI5kCBQBAQEBAQgJDQcUJoFTAQEFEgIPBBkBGxILAQMMBgULDQICCR0CAiEBAREBBQEKEgYTCAoQh1mWdwqKfkKCV4VEO4htAgMGgSaEMYERBJM/ig2CbT2Dbw X-IronPort-AV: E=Sophos;i="4.68,383,1312149600"; d="scan'208";a="109100552" Received: from mail-iy0-f182.google.com ([209.85.210.182]) by mail4-smtp-sop.national.inria.fr with ESMTP/TLS/RC4-SHA; 14 Sep 2011 23:44:35 +0200 Received: by iadk27 with SMTP id k27so1074586iad.27 for ; Wed, 14 Sep 2011 14:44:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; bh=7YQevcX1F/hB7uRdd2M84JV7eni7IRrzPRB1A/8mATs=; b=Jznuj9MkD5CHs8xtE8jxk+fSwksD5WjI/qIRlb3BFBpL303LF8OB3WzaBhUQ1HU6LD 8Y92gfapCADTz/sfG5uKWbH7701QvxLvHf2EFIarKKXuRq7BYMmJWFbGadTnNt97eOXt x1r8NqBmCIOanOaObszAxspcX/8E2qeMQxB9Y= MIME-Version: 1.0 Received: by 10.42.152.6 with SMTP id g6mr234108icw.517.1316036673902; Wed, 14 Sep 2011 14:44:33 -0700 (PDT) Received: by 10.42.165.2 with HTTP; Wed, 14 Sep 2011 14:44:32 -0700 (PDT) In-Reply-To: References: Date: Wed, 14 Sep 2011 22:44:32 +0100 Message-ID: From: Raphael Proust To: Philippe Veber Cc: Walter Cazzola , OCaML Mailing List Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by walapai.inria.fr id p8ELibmG005486 Subject: Re: [Caml-list] pattern matching on strings Richard Jones described the internals of OCaml quite concisely. The difference between char arrays and strings is exposed in part two of his series of posts: https://rwmj.wordpress.com/2009/08/05/ocaml-internals-part-2-strings-and-other-types/ There is a pointer to http://caml.inria.fr/pub/ml-archives/caml-list/2002/08/e109df224ff0150b302033e2002dbf87.en.html in the article. On 9/14/11, Philippe Veber wrote: > Hi Walter, > > Contrary to Prolog or Haskell, strings in ocaml are not represented as char > lists. They are exactly like char array, but have their own type, operations > and syntax : strings are created with String.make (similar to Array.make), > their length is given by String.length (sim. to Array.length) and the chars > are accessed with the notation s.[i] (similar to t.(i)). Actually I don't > know why they are not defined like char arrays (anyone on this ?). Long > story short, recursive formulations on strings (likewise for array) will > often rely on indices (and thus, not much on pattern matching). Note that > you can use optional arguments to hide indices : > > let rec iter f ?(k = 0) s = > if k < String.length s then ( > f s.[k] ; > iter f ~k:(k + 1) s > ) > > let _ = iter print_char "abc";; > > > The closest to your request I see can be achieved using ocaml batteries (*), > by transforming your string into a list: > > let rec iter_aux f = function > [] -> () > | c :: s1 -> f c ; iter_aux f s1 > let iter f s = iter_aux f (String.explode s) > > But this won't be very efficient ! > > You won't find advanced string pattern matching in core ocaml. But micmatch > seems a nice way to go if that's what you're looking for. > > cheers, > Philippe. > > (*) http://batteries.forge.ocamlcore.org/ > > > 2011/9/14 Walter Cazzola > >> Hi all, >> I'm just trying to write a recursive function that iterates¹ on a string >> and I'd like to use pattern matching as in: >> >> let rec iter f s = >> match s with >> | "" -> unit; >> | c^s1 -> f c; iter f s1;; >> >> but the ^ concatenates 2 strings and not a char with a string and above >> all seems to be inadmissible in the patterns. >> >> Does this mean that I can't write a function on strings by pattern >> matching or is there something I don't know?² >> >> Thanks for the help >> Walter >> >> ¹ I know that exists String.iter but I'd like to improve my skill in >> writing functions by using pattern matching >> ² I read about micmatch but I'd like to avoid non standard packages. >> -- >> -- >> Caml-list mailing list. Subscription management and archives: >> https://sympa-roc.inria.fr/**wws/info/caml-list >> Beginner's list: >> http://groups.yahoo.com/group/**ocaml_beginners >> Bug reports: >> http://caml.inria.fr/bin/caml-**bugs >> >> > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa-roc.inria.fr/wws/info/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > > -- _______ Raphael