Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* [Caml-list] really HO Functions
@ 2004-09-29 18:48 Radu Grigore
  2004-09-29 19:24 ` Jacques Carette
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Radu Grigore @ 2004-09-29 18:48 UTC (permalink / raw)
  To: caml-list

For this message I'll classify functions on "levels" based on how many
nested parenthesis are needed to represent their type.

Functions of level 0 (e.g. int -> int, char -> int -> int, ...) are
the most used in programming. In widespread languages like C#, Java
and C++ they are almost the only kind of functions used.

Functions of level 1 (e.g. ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)) are
used a lot when programming in a functional language. They are also
the ones that appear in examples and tutorials written for imperative
programmers. This category includes fold, iter, map, composition.

However a language like OCaml allows N to go up as much as you want.
My question is: are there functions of level >= 2 used in practice
(e.g. (('a -> 'b -> 'a) -> 'a -> 'b list -> 'a) -> 'c)? If so, are
there any typical ones that appear in many applications (maybe not as
widespread like map & company but at least of comparable usefulness)?
One example of a level 2 function (stolen from a recent post by Jon
Harrop) is this:
  let sum fold = fold (+);;

regards,
radu

-------------------
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


^ permalink raw reply	[flat|nested] 11+ messages in thread
* Re: [Caml-list] really HO Functions
@ 2004-09-29 20:48 Jean-Baptiste Rouquier
  2004-10-02  5:02 ` Radu Grigore
  0 siblings, 1 reply; 11+ messages in thread
From: Jean-Baptiste Rouquier @ 2004-09-29 20:48 UTC (permalink / raw)
  To: caml-list

Radu Grigore wrote:

>For this message I'll classify functions on "levels" based on how many
>nested parenthesis are needed to represent their type. (...)
>
>My question is: are there functions of level >= 2 used in practice
>(e.g. (('a -> 'b -> 'a) -> 'a -> 'b list -> 'a) -> 'c)?

In my soon-to-be-released library to read and write configuration files, I have
one example of this. Basically, the function reading a file (actually a method)
has on optional argument that allows the user to override the default behaviour
in case there is an error.
The argument is itself a function that get all the available information as
arguments, including a value of type (out_channel -> unit) that pretty print
(with module Format) a part of the read AST to the given output channel.
So I have
    method read : ... -> ... ->
      ?on_type_error : (... -> ... -> (out_channel -> unit) -> ... -> unit) ->
      string -> unit

Out of curiosity, may I ask why you're looking for such functions ?
Regards,

-- 
Jean-Baptiste Rouquier

-------------------
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


^ permalink raw reply	[flat|nested] 11+ messages in thread
* RE: [Caml-list] really HO Functions
@ 2004-09-30 17:30 Harrison, John R
  0 siblings, 0 replies; 11+ messages in thread
From: Harrison, John R @ 2004-09-30 17:30 UTC (permalink / raw)
  To: caml-list; +Cc: Harrison, John R

| I've just had a look through some real programs that I've written and
the 
| answer is definitely yes. I use them quite a lot. For >2 they are
mainly 3, 
| sometimes 4 and I haven't seen any >4.

I haven't actually checked, but I suspect I'd find something similar.
There may
be an interesting psychological observation to be made here: most people
find
very high-order functions intellectually unmanageable.

Something similar is usually acknowledged in logic with respect to long
quantifier alternations (for all x there exists a y such that for all z,
...).
I believe I once saw a provocative claim by Kreisel that most
mathematical
concepts are in fact only invented in order to hide complicated
quantifier
alternations.

John.

-----Original Message-----
From: owner-caml-list@pauillac.inria.fr
[mailto:owner-caml-list@pauillac.inria.fr] On Behalf Of Jon Harrop
Sent: Wednesday, September 29, 2004 3:31 PM
To: caml-list
Subject: Re: [Caml-list] really HO Functions


On Wednesday 29 September 2004 19:48, Radu Grigore wrote:
> My question is: are there functions of level >= 2 used in practice
> (e.g. (('a -> 'b -> 'a) -> 'a -> 'b list -> 'a) -> 'c)?

I've just had a look through some real programs that I've written and
the 
answer is definitely yes. I use them quite a lot. For >2 they are mainly
3, 
sometimes 4 and I haven't seen any >4.

> If so, are 
> there any typical ones that appear in many applications (maybe not as
> widespread like map & company but at least of comparable usefulness)?

I seem to use them when I write generic functions which are later
specialised.

> One example of a level 2 function (stolen from a recent post by Jon
> Harrop) is this:
>   let sum fold = fold (+);;

Funny to think that this function is still state-of-the-art Java and
C++. ;-)

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

-------------------
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


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2004-10-02 16:44 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-09-29 18:48 [Caml-list] really HO Functions Radu Grigore
2004-09-29 19:24 ` Jacques Carette
2004-09-29 22:31 ` Jon Harrop
2004-09-29 23:32   ` Marcin 'Qrczak' Kowalczyk
2004-09-30  6:27     ` Diego Olivier Fernandez Pons
2004-09-30 19:27 ` Michal Moskal
2004-09-29 20:48 Jean-Baptiste Rouquier
2004-10-02  5:02 ` Radu Grigore
2004-10-02  6:33   ` John Prevost
2004-10-02 16:44     ` Seth J. Fogarty
2004-09-30 17:30 Harrison, John R

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox