Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Jon Harrop <jon@jdh30.plus.com>
To: caml-list <caml-list@inria.fr>
Subject: Re: [Caml-list] C++ STL and template features compared with OCaml parametric polymorphism and OO features
Date: Mon, 27 Sep 2004 14:11:30 +0100	[thread overview]
Message-ID: <200409271411.30384.jon@jdh30.plus.com> (raw)
In-Reply-To: <7f8e92aa0409270350ce0eed2@mail.gmail.com>

On Monday 27 September 2004 11:50, Radu Grigore wrote:
> On Mon, 27 Sep 2004 02:59:43 +0100, Jon Harrop <jon@jdh30.plus.com> wrote:
> > What is the difference between a generic function and a function which
> > dispatches to appropriate specialised functions?
>
> For the client of the function there is no difference.
>
> For the writter of the function there is a big difference, especially
> if it has to write the specialized versions.

The equivalent to the writer of fold is the writer of an iterator. You have to 
write specialized versions for each type of iterator just as you would have 
to write your own fold.

Check out vector<T>::iterator and set<T>::iterator. Consider writing a splay 
tree in C++ using iterators. You would have to rewrite most of what's in the 
STL for "set" by hand...

> The good news is that the 
> OCaml library gives you those specialized functions (fold) for common
> data structures like List and Array. The bad news is that you are on
> your own if you define new data structures that can be viewed as
> sequences.

Right, like Set, which has a completely different fold to array and list. 
Equivalently, the implementations for vector, list and set iterators in C++ 
will be completely different. I don't think iterators buy you anything.

> The meaning of "fold" is "apply this function repeatedly for each
> element of the data-structure and accumulate the result". I'd like to
> be able to write this in code _once_ for every data-structure that can
> be seen as a sequence (i.e. a set of totaly ordered elements).

Why not write fold once "for every data structure..." seeing as they have next 
to nothing in common?

> You can 
> do this with iterators. As the article cited by Vasili shows there is
> an analogue of iterators in functional languages.

Presumably the benefit of iterators in a functional language would be 
bidirectional traversal of a sequence container. But iterators fall apart on 
general trees, matrices and anything which isn't just a sequence of elements. 
In many such cases you want mapi...

> So we are not really talking here about
> differences between OCaml and C++; we are talking about library
> design.

I think we are, because I think iterators are only really useful in an 
imperative setting. Hence C++ programmers use them extensively but OCaml 
programmers do not. Folds are simply not feasible in C++. I'm sure Stepanov 
would have reinvented them if they had been... ;-)

On Monday 27 September 2004 13:14, skaller wrote:
> Except you have to write:
>  let List.mapmap g f x = List.map g (List.map f x)
>  let Array.mapmap g f x = Array.map g (Array.map f x)

No, you don't have to write that. You can write a generic function which 
accepts a map as an argument:

let map_2 map f g c = map f (map g c)

or better still, the deforested:

let map_2 map f g c = map (fun x -> f (g x)) c

You can't write map_n without some jiggery pokery though.

> ...
> A generalised fold doesn't require either a sequence or any
> ordering

Folds with a particular direction are much more useful, IMHO. Hence the folds 
in the core library are left or right for arrays and lists and up for sets 
and maps.

> -- it just applies to all the elements of a container 
> in any order (so it works for a tree too).

A lexicographically ordered traversal can be defined for any data structure in 
OCaml - that's how hash and compare work.

Cheers,
Jon.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2004-09-27 13:16 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-25 21:12 Vasili Galchin
2004-09-25 21:38 ` Nicolas Cannasse
2004-09-25 22:15   ` Vasili Galchin
2004-09-25 22:52     ` Vasili Galchin
2004-09-26  1:34       ` Jon Harrop
2004-09-26  5:31         ` Radu Grigore
2004-09-26  9:47           ` sejourne_kevin
2004-09-26 13:05           ` Jon Harrop
2004-09-26 14:36             ` skaller
2004-09-26 15:08               ` sejourne_kevin
2004-09-26 15:27                 ` skaller
2004-09-26 18:51               ` Jon Harrop
2004-09-26 20:14                 ` Radu Grigore
2004-09-27  1:59                   ` Jon Harrop
2004-09-27  4:48                     ` skaller
2004-09-27  9:40                       ` Jacques GARRIGUE
2004-09-27 10:50                     ` Radu Grigore
2004-09-27 12:14                       ` skaller
2004-09-27 13:11                       ` Jon Harrop [this message]
2004-09-27 13:31                         ` Radu Grigore
2004-09-27 16:54                           ` Jon Harrop
2004-09-29 18:59                             ` Radu Grigore
2004-09-27 13:32                         ` Radu Grigore
2004-09-27 14:04                         ` Brian Hurt
2004-09-27 14:58                           ` skaller
2004-09-27 15:30                             ` Brian Hurt
2004-09-27 16:38                               ` skaller
2004-09-27 17:01                                 ` Brian Hurt
2004-09-28  1:21                                   ` skaller
2004-09-27 16:41                           ` brogoff
2004-09-28  0:26                             ` skaller
2004-09-29 15:32                         ` Florian Hars
2004-09-29 16:49                           ` [Caml-list] Factoring HOFs [was Re: C++ STL...] Jon Harrop
2004-09-30  9:19                             ` Radu Grigore
2004-09-30 10:13                             ` Keith Wansbrough
2004-09-30 10:31                               ` Keith Wansbrough
2004-09-30 13:21                               ` skaller
2004-09-30 23:17                               ` [Caml-list] Factoring HOFs Jacques Garrigue
2004-10-01  8:46                                 ` Keith Wansbrough
2004-10-01 17:35                                 ` brogoff
2004-09-26 20:43                 ` [Caml-list] C++ STL and template features compared with OCaml parametric polymorphism and OO features skaller
2004-09-26 14:19           ` skaller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200409271411.30384.jon@jdh30.plus.com \
    --to=jon@jdh30.plus.com \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox