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 <philippe.ve...@gmail.com> 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 <cazz...@dico.unimi.it> > >> 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<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 -- 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