From: Jon Harrop <jon@ffconsultancy.com>
To: caml-list@yquem.inria.fr
Subject: The Implicit Accumulator: a design pattern using optional arguments
Date: Wed, 27 Jun 2007 13:14:34 +0100 [thread overview]
Message-ID: <200706271314.35134.jon@ffconsultancy.com> (raw)
I can't find the thread where we were talking about design patterns recently
but I'd like to note a design pattern that works nicely in OCaml. I'll call
it "The Implicit Accumulator".
ML programmers often use nested auxiliary functions or separate functions to
handle base cases. For example, writing rev in terms of rev_append:
# let rec rev_append l1 l2 = match l1 with
| [] -> l2
| a :: l -> rev_append l (a :: l2);;
val rev_append : 'a list -> 'a list -> 'a list = <fun>
# let rev l = rev_append l [];;
val rev : 'a list -> 'a list = <fun>
Provided performance is unimportant, you can make the accumulator implicit in
OCaml by specifying the default value in an optional argument instead of
having a separate function:
# let rec rev ?(back=[]) = function
| [] -> back
| h::t -> rev ~back:(h::back) t;;
val rev : ?back:'a list -> 'a list -> 'a list = <fun>
When you don't want the auxiliary (rev_append) function, I think this style
results in shorter and clearer code. I used it in the "search" function of my
Sudoku solver, for example:
let rec search ?(x=0) ?(y=0) f accu = match x, y with
9, y -> search ~x:0 ~y:(y+1) f accu (* Next row *)
| 0, 9 -> f accu (* Found a solution *)
| x, y ->
if m.(y).[x] <> '0' then search ~x:(x+1) ~y f accu else
fold (fun accu n ->
let n = Char.chr (n + 48) in
if invalid x y n then accu else
(m.(y).[x] <- n;
let accu = search ~x:(x+1) ~y f accu in
m.(y).[x] <- '0';
accu)) accu 1 10
and it crops up quite a lot in addition to all of the "conventional" uses of
optional arguments.
--
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
The OCaml Journal
http://www.ffconsultancy.com/products/ocaml_journal/?e
next reply other threads:[~2007-06-27 12:20 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-27 12:14 Jon Harrop [this message]
2007-06-27 13:18 ` [Caml-list] " Quôc Peyrot
2007-06-27 13:53 ` Jon Harrop
2007-06-27 14:18 ` Thomas Fischbacher
2007-06-27 15:09 ` Quôc Peyrot
2007-06-27 15:28 ` Mattias Engdegård
2007-06-27 15:38 ` Robert Fischer
2007-06-27 15:48 ` Mattias Engdegård
2007-06-27 16:01 ` Robert Fischer
2007-06-27 16:01 ` Mattias Engdegård
2007-06-27 18:06 ` Jon Harrop
2007-06-27 18:31 ` Brian Hurt
2007-06-27 19:56 ` skaller
2007-06-27 20:17 ` Jonathan Bryant
2007-06-27 22:57 ` Jon Harrop
2007-06-27 16:53 ` Hash-consing (was Re: [Caml-list] The Implicit Accumulator: a design pattern using optional arguments) Daniel Bünzli
2007-06-30 8:19 ` [Caml-list] The Implicit Accumulator: a design pattern using optional arguments Pierre Etchemaïté
2007-06-27 13:55 ` Thomas Fischbacher
2007-06-27 15:06 ` Quôc Peyrot
2007-06-27 15:53 ` Jon Harrop
2007-06-28 11:01 ` Thomas Fischbacher
2007-06-28 11:32 ` Jon Harrop
2007-06-28 11:42 ` Joel Reymont
2007-06-28 12:08 ` Jon Harrop
2007-06-28 13:10 ` Quôc Peyrot
2007-06-28 13:35 ` Thomas Fischbacher
2007-06-28 12:59 ` Thomas Fischbacher
2007-06-28 13:05 ` Jon Harrop
2007-06-28 13:33 ` Thomas Fischbacher
2007-06-28 14:43 ` Jon Harrop
2007-06-28 16:01 ` Thomas Fischbacher
2007-06-28 17:53 ` Jon Harrop
2007-06-27 16:39 ` Thomas Fischbacher
2007-06-27 19:26 ` Quôc Peyrot
2007-06-28 11:39 ` Thomas Fischbacher
2007-06-28 14:44 ` Jon Harrop
2007-06-28 16:03 ` Thomas Fischbacher
2007-06-28 17:20 ` Dirk Thierbach
2007-06-28 22:12 ` Thomas Fischbacher
2007-06-29 1:10 ` Jon Harrop
2007-06-29 10:55 ` Thomas Fischbacher
2007-06-29 6:12 ` Dirk Thierbach
2007-06-27 17:16 ` Book about functional design patterns Gabriel Kerneis
2007-06-27 17:48 ` [Caml-list] " Jon Harrop
2007-06-27 19:33 ` Quôc Peyrot
2007-06-27 19:30 ` Quôc Peyrot
2007-06-27 19:48 ` Brian Hurt
2007-06-27 20:04 ` Quôc Peyrot
2007-06-27 20:35 ` Brian Hurt
2007-06-27 20:55 ` Quôc Peyrot
2007-06-27 20:58 ` Pal-Kristian Engstad
2007-06-27 21:18 ` Quôc Peyrot
2007-06-27 21:18 ` Pal-Kristian Engstad
2007-06-27 21:34 ` Quôc Peyrot
2007-06-27 22:13 ` Pal-Kristian Engstad
2007-06-27 15:18 ` [Caml-list] The Implicit Accumulator: a design pattern using optional arguments Jon Harrop
2007-06-27 16:44 ` Thomas Fischbacher
2007-06-27 18:17 ` Jon Harrop
2007-06-28 11:18 ` Thomas Fischbacher
2007-06-29 13:15 ` Bill Wood
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=200706271314.35134.jon@ffconsultancy.com \
--to=jon@ffconsultancy.com \
--cc=caml-list@yquem.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