Thank you Raphael ! Indeed, keeping the C encoding underneath strings (and arrays) is a nice property. ph. 2011/9/14 Raphael Proust > 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< > https://sympa-roc.inria.fr/wws/info/caml-list> > >> Beginner's list: > >> http://groups.yahoo.com/group/**ocaml_beginners< > 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 >