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

2011/9/14 Raphael Proust <raphla...@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.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

Reply via email to