From: Diego Olivier Fernandez Pons <Diego-Olivier.FERNANDEZ-PONS@cicrp.jussieu.fr>
To: mgushee@havenrock.com
Cc: caml-list@pauillac.inria.fr
Subject: Re: [Caml-list] OCaml popularity (long!)
Date: Wed, 12 Mar 2003 12:23:01 +0100 (NFT) [thread overview]
Message-ID: <Pine.A41.4.44.0303121048180.3588136-100000@ibm1.cicrp.jussieu.fr> (raw)
In-Reply-To: <3E6DDAFC.19000.44771B6@localhost>
Bonjour,
> My other big problem with Haskell was ... you guessed it: monads! I
> must have read every introduction to monads that's available on line
> (and there are at least half a dozen), but I still don't really
> understand them.
Monads are not specific to Haskell and they may be useful in many
other situations than IO in a lazy context. FFTW and FFTW-GEL both use
monads for graph traversal (even if I think afterwards it may not be
the best way).
I will try to explain monads briefly and in a non-academic manner,
since all academic explainations seem to have failed.
When you write a program, you usually have some data x and functions f
and g that you apply over your data
let x1 = f x
let x2 = g x1
Which we will write g (f x)
In functional languages, functions are first class citizens and then
you can use them as if they were data. You can do this transformation
(which I will call duality) in an explicit manner :
let dual = function x -> (function f -> f x)
Instead of writing g (f x) we will have (dual x) (g o f) where the
'o' stands for composition
let (o) = fun f g -> (function x -> g (f x))
You can write all your programs in this 'higher-order' style. We will
use a small example I have already used in a precedent post on
continuation passing style
let rec min_list_rec m= function
| [] -> m
| x :: tail when x < m -> min_list_rec x tail
| _ :: tail -> min_list_rec m tail
val min_list_rec : 'a -> 'a list -> 'a = <fun>
let min_list = function
| [] -> failwith "the list is empty"
| x :: tail -> min_list_rec x tail
val min_list : 'a list -> 'a
This is the 'level 0' style.
To transform it to a 'higher-order' style we will use the 'min'
function and a 'list-traversal' function as basic data
let rec list_traversal f = function
| [] -> failwith "empty list"
| [x] -> x
| x :: tail -> f x (list_traversal f tail)
val list_traversal : ('a -> 'a -> 'a) -> 'a list -> 'a
let min_list = list_traversal min
min_list : 'a list -> 'a
The computation may be seen in the following way
let f1 = F f
let f2 = G f1
...
fn (x)
Why would you want to do something like this ?
When you write in a functional language f x y, the order in which the
two arguments will be evaluated in undefined. When you want to do IO
this may be a problem : which data will be printed first ?
On the other hand, the higher order style has a defined order : when
you write g o f, f will always be evaluated before g.
Then several solutions are available :
- Write your code with explicit sequences : f x y => f2 (f1 x y)
where f1 does the first operation, f2 the second one.
- use a built-in sequence operator (Caml sequence ';')
- use a built-in higher order tool (Haskell monads, Scheme
continuations)
One more thing, you will find two classical 'higher order' styles :
monadic style and continuation passing style
let rec min_list_rec f = function
| [] -> failwith "empty list"
| [x] -> f x
| x :: tail -> min_list_rec (fun y -> f (min x y)) tail
val min_list_rec : ('a -> 'b) -> 'a list -> 'b
let min_list = min_list_rec (function x -> x)
What is the difference ?
Roughtly, in monadic style you only apply on the right (dual x) (f (g
(h))),in CPS you can apply on the left or the right (dual x) (h (f
(g))).
This is achived by giving you one more parameter, the 'continuation'
of the current computation. In my 'min_list' example the continuation
is just the identity function.
Monads also need some 'algebraic' properties, the correct mathematical
formalisation is the theory of categories (Saunders Mac Lane, Samuel
Eilenberg)
Wadler has shown that in fact CPS and monads are equivalent (you can
simulate each one with the other one). The combination with lazy
evaluation (which can also be done in Caml) can give strange monads
like 'backtracking monad' (Wadler) which may be used to implement
backtracking searches, embedding a Prolog in a functional language
(Hinze). This can be also achieved by CPS like Screamer, a Lisp
preprocessor that rewrittes backtracking function in CPS (Siskind,
McAllester) or direct implementation with some kind of queue.
Hope this helps,
Diego Olivier
-------------------
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
next prev parent reply other threads:[~2003-03-12 11:24 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-03-06 23:27 [Caml-list] OCaml popularity Graham Guttocks
2003-03-10 20:43 ` Paul Steckler
2003-03-10 23:48 ` Gerd Stolpmann
2003-03-11 0:18 ` Brian Hurt
2003-03-17 23:49 ` Graham Guttocks
2003-03-11 1:43 ` Nicolas Cannasse
2003-03-11 10:23 ` Pierre Weis
2003-03-11 14:27 ` Guillaume Marceau
2003-03-11 16:16 ` David Brown
2003-03-11 16:47 ` [Caml-list] about -rectypes Christophe Raffalli
2003-03-12 2:32 ` [Caml-list] OCaml popularity Nicolas Cannasse
2003-03-12 3:55 ` Cross-platform GUI (was Re: [Caml-list] OCaml popularity) mgushee
2003-03-12 10:51 ` [Caml-list] OCaml popularity Alex Romadinoff
2003-03-12 18:24 ` Max Kirillov
2003-03-11 19:02 ` Graham Guttocks
2003-03-12 17:12 ` Richard W.M. Jones
2003-03-12 18:08 ` Alwyn Goodloe
2003-03-12 22:34 ` Michael Schuerig
2003-03-12 23:13 ` Martin Weber
2003-03-12 23:35 ` Michael Schuerig
2003-03-13 8:02 ` Alessandro Baretta
2003-03-13 10:23 ` Michael Schuerig
2003-03-12 23:35 ` Brian Hurt
2003-03-12 23:18 ` Daniel Bünzli
2003-03-12 23:47 ` Brian Hurt
2003-03-13 2:15 ` William Lovas
2003-03-13 3:44 ` Graham Guttocks
2003-03-13 9:31 ` Richard W.M. Jones
[not found] ` <20030313095232.GC347@first.in-berlin.de>
2003-03-13 20:50 ` William Lovas
2003-03-13 21:17 ` Oliver Bandel
2003-03-13 22:01 ` Brian Hurt
2003-03-13 22:17 ` Oliver Bandel
2003-03-14 6:33 ` Michal Moskal
2003-03-14 11:50 ` Markus Mottl
2003-03-14 15:38 ` Oliver Bandel
2003-03-14 10:13 ` MikhailFedotov
2003-03-14 10:30 ` Johann Spies
2003-03-13 8:09 ` Pierre Weis
2003-03-15 1:43 ` Tushar Samant
2003-03-15 8:19 ` Andreas Eder
2003-03-11 16:26 ` Fred Yankowski
2003-03-11 19:47 ` [Caml-list] OCaml popularity (long!) mgushee
2003-03-12 11:23 ` Diego Olivier Fernandez Pons [this message]
2003-03-30 5:59 ` Belated thanks (was Re: [Caml-list] OCaml popularity) Matt Gushee
2003-03-31 15:27 ` [Caml-list] Re: Belated thanks cashin
2003-04-01 8:22 ` Belated thanks (was Re: [Caml-list] OCaml popularity) Johann Spies
2003-03-12 20:41 ` [Caml-list] OCaml popularity (long!) Max Kirillov
2003-03-13 2:36 ` Haskell-like syntax (was: [Caml-list] OCaml popularity (long!)) Oleg
2003-03-13 18:33 ` [Caml-list] Re: Haskell-like syntax Max Kirillov
2003-03-14 19:30 ` Max Kirillov
2003-03-14 19:47 ` Max Kirillov
2003-03-14 20:01 ` Seth Kurtzberg
2003-03-14 20:34 ` brogoff
2003-03-14 21:17 ` Sebastien Carlier
2003-03-14 21:51 ` brogoff
2003-03-15 2:27 ` Max Kirillov
2003-03-15 10:58 ` Markus Mottl
2003-03-15 15:52 ` [Caml-list] globally valid symbols (was: Haskell-like syntax) Max Kirillov
2003-03-15 20:16 ` [Caml-list] Re: Haskell-like syntax David Brown
2003-03-16 5:28 ` Module recursion (Was Re: [Caml-list] Re: Haskell-like syntax) brogoff
2003-03-16 11:10 ` Markus Mottl
2003-03-16 18:02 ` brogoff
2003-03-16 18:34 ` Markus Mottl
[not found] ` <Pine.LNX.4.44.0303152112560.27230-100000@grace.speakeasy.n et>
2003-03-16 5:38 ` Chris Hecker
2003-03-16 18:34 ` brogoff
2003-03-17 2:20 ` Jacques Garrigue
[not found] ` <Pine.LNX.4.44.0303161020480.11736-100000@grace.speakeasy.n et>
2003-03-17 5:08 ` Chris Hecker
2003-03-17 17:06 ` brogoff
2003-03-17 19:01 ` Ville-Pertti Keinonen
[not found] ` <Pine.LNX.4.44.0303170836240.29039-100000@grace.speakeasy.n et>
2003-03-17 19:33 ` Chris Hecker
2003-03-17 20:28 ` brogoff
[not found] ` <Pine.LNX.4.44.0303171145500.29039-100000@grace.speakeasy.n et>
2003-03-17 21:09 ` Chris Hecker
2003-03-19 2:34 ` [Caml-list] ocamlopt speed (was Re: Module recursion) Chris Hecker
2003-03-19 10:03 ` Michal Moskal
2003-03-19 10:38 ` Gerd Stolpmann
2003-03-19 20:36 ` Chris Hecker
2003-03-17 1:46 ` [Caml-list] Re: Haskell-like syntax Nicolas Cannasse
2003-03-14 22:50 ` Oleg
2003-03-20 15:01 ` Andreas Rossberg
2003-03-12 20:46 ` [Caml-list] Monads was OCaml popularity Christophe Raffalli
2003-03-13 0:03 ` [Caml-list] monads for dummies james woodyatt
2003-03-13 4:32 ` Christopher Quinn
2003-03-13 11:53 ` Christian Lindig
2003-03-12 18:59 ` [Caml-list] OCaml popularity Martin Weber
2003-03-12 20:24 ` Xavier Leroy
2003-03-13 8:57 ` [Caml-list] how to interface with integer Bigarrays using camlidl francois bereux
2003-03-13 9:36 ` Xavier Leroy
2003-03-13 0:42 ` [Caml-list] OCaml popularity Graham Guttocks
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=Pine.A41.4.44.0303121048180.3588136-100000@ibm1.cicrp.jussieu.fr \
--to=diego-olivier.fernandez-pons@cicrp.jussieu.fr \
--cc=caml-list@pauillac.inria.fr \
--cc=mgushee@havenrock.com \
/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