caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Martin Chabr <martin_chabr@yahoo.de>
To: Wolfgang Lux <wlux@uni-muenster.de>
Cc: caml-list@yquem.inria.fr
Subject: Ant:  Re: Ant:  Re: [Caml-list] Avoiding shared data
Date: Sat, 1 Oct 2005 23:50:45 +0200 (CEST)	[thread overview]
Message-ID: <20051001215045.89913.qmail@web26808.mail.ukl.yahoo.com> (raw)
In-Reply-To: <bd05c1f3fecf4de4bbae0cca1621e644@uni-muenster.de>

Hello Wolfgang,

you are quite right, most loops can easily be
transformed by using map, filter, fold_left or
fold_right. I just tend to forget about it or find it
uneasy if the problem is more complex. It may be just
a matter of habit.

Regards,

Martin

--- Wolfgang Lux <wlux@uni-muenster.de> schrieb:

> Pal-Kristian Engstad wrote:
> 
> > The author argues that "Writing loops with
> tail-recursive function 
> > calls is
> > the equivalent of writing them with goto’s." and
> gives an example that 
> > I've
> > rewritten from Scheme-ish into OCaml-ish:
> >
> > let myfunc l =
> >   let rec loop rest result =
> >     match rest with
> >       | [] -> List.rev result
> >       | x::xs ->
> > 	  if xpred x then
> > 	    let y = verbose_code_using_x x in
> > 	      if ypred y then
> > 		let z = verbose_code_using_y y in
> > 		  loop xs (z_expression :: result)
> > 	      else
> > 		loop xs result
> > 	  else
> > 	    loop xs result
> >   in
> >     loop l []
> > ;;
> >
> > Obviously, one would like to refactor this into
> HOF, but in this 
> > situation it
> > is hard to see how one should do it.
> 
> Oh come on! IMHO, most loops can easily be
> transformed by using map, 
> filter,
> fold_left, and fold_right. The example given is no
> exception. The loop
> essentially applies some complex code to every
> element of the list and
> includes the result in the output list only if a
> condition is satisfied
> that is computed along with result. This is always
> the structure of a 
> fold.
> (If the condition were independent from the result
> one could combine a 
> filter
> and a map.) Thus, a straight forward rewrite of the
> loop is:
> 
>    let myfunc l =
>      let f x result =
>            if xpred then
>              let y = verbose_code_using_x x in
>                if ypred y then
>                  let z = verbose_code_using_y y in
>                    z_expression :: result
>                else
>                  result
>            else
>              result
>      in
>        fold_right f l []
> 
> Furthermore, I would turn the two if expressions
> into local functions
> 
>    let myfunc l =
>      let g y result =
>            if ypred y then
>              let z = verbose_code_using_y y in
> z_expression :: result
>            else
>              result
>      in let f x result =
>           if xpred x then
>             let y = verbose_code_using_x x in g y
> result
>           else
>             result
>      in fold_right f l []
> 
> Regards
> Wolfgang
> 
> _______________________________________________
> Caml-list mailing list. Subscription management:
>
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list:
> http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 



	

	
		
___________________________________________________________ 
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de


  parent reply	other threads:[~2005-10-01 21:50 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-25 21:32 Martin Chabr
2005-09-26  0:23 ` [Caml-list] " Bill Wood
2005-09-26  7:57 ` Claudio Sacerdoti Coen
2005-09-26  8:17 ` William Lovas
2005-09-26 21:07   ` Ant: " Martin Chabr
2005-09-26 22:08     ` Jon Harrop
2005-09-30 22:57     ` Oliver Bandel
2005-10-01  0:07       ` Pal-Kristian Engstad
2005-10-01  5:46         ` Bill Wood
2005-10-01  8:27         ` Wolfgang Lux
2005-10-01 18:02           ` Wolfgang Lux
2005-10-01 21:50           ` Martin Chabr [this message]
2005-10-01 12:34         ` Oliver Bandel
2005-10-01 13:58           ` Bill Wood
2005-10-01 21:05         ` Ant: " Martin Chabr
2005-10-03  0:41           ` skaller
2005-10-03  1:13             ` Seth J. Fogarty
2005-10-03 13:09             ` Thomas Fischbacher
2005-10-03 14:57               ` skaller
2005-10-03 20:03               ` Ant: " Martin Chabr
2005-10-03 20:25                 ` Thomas Fischbacher
2005-10-03 21:08                 ` Jon Harrop
2005-10-04 18:06                   ` Ant: " Martin Chabr
2005-10-04 18:32                     ` Jon Harrop
2005-10-04  2:53                 ` skaller
2005-10-04 16:15                   ` Brian Hurt
2005-10-04 16:47                     ` FP/IP and performance (in general) and Patterns... (Re: [Caml-list] Avoiding shared data) Oliver Bandel
2005-10-04 22:38                       ` Michael Wohlwend
2005-10-05  0:31                         ` Jon Harrop
2005-10-04 22:39                       ` Christopher A. Watford
2005-10-04 23:14                         ` Jon Harrop
2005-10-05 12:10                         ` Oliver Bandel
2005-10-05 13:08                           ` Jon Harrop
2005-10-05 15:28                           ` skaller
2005-10-05 20:52                           ` Ant: " Martin Chabr
2005-10-05 23:21                             ` Markus Mottl
2005-10-06 16:54                               ` brogoff
2005-10-05  0:45                       ` Brian Hurt
2005-10-04 18:09                   ` Ant: Re: Ant: Re: Ant: Re: Ant: Re: [Caml-list] Avoiding shared data Martin Chabr
2005-10-05  8:42                     ` skaller
2005-10-05 11:14               ` Andrej Bauer
2005-10-01 21:36       ` Ant: Re: Ant: " Martin Chabr
2005-10-03 11:51         ` getting used to FP-programming (Re: Ant: Re: Ant: Re: [Caml-list] Avoiding shared data) Oliver Bandel

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=20051001215045.89913.qmail@web26808.mail.ukl.yahoo.com \
    --to=martin_chabr@yahoo.de \
    --cc=caml-list@yquem.inria.fr \
    --cc=wlux@uni-muenster.de \
    /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;
as well as URLs for NNTP newsgroup(s).