Thank you Raphael !
Indeed, keeping the C encoding underneath strings (and arrays) is a nice property.
ph.

2011/9/14 Raphael Proust <raphlalou@gmail.com>
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.veber@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 <cazzola@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