From: John Prevost <jprevost@libcom.com>
To: caml-list@inria.fr
Cc: romildo@uber.com.br
Subject: Re: [Caml-list] Function definition with multiple patterns in multiple equations
Date: Tue, 8 Jan 2002 08:26:39 -0500 [thread overview]
Message-ID: <20020108082639.A87628@libcom.com> (raw)
In-Reply-To: <20020108110836.A9147@darling.home.br>
On Tue, Jan 08, 2002 at 11:08:36AM -0200, José Romildo Malaquias wrote:
>None of them seems to be supported by the language. In SML, one can write
>
> fun f 0 0 = 1
> | f _ _ = 0
>
>What is the equivalent in OCaml?
There is no perfect equivalent in O'Caml. Here, there are two ways
to write function definitions. One of them allows multiple arguments
to be specified:
let f = fun p1 p2 p3 ... -> e
(which is equivalent to)
let f p1 p2 p3 ... = e
The other allows multiple patterns to be specified for one argument:
let f = function
| p1 -> e1
| p2 -> e2
| p3 -> e3
| ...
(which is equivalent to)
let f x = match x with
| p1 -> e1
| p2 -> e2
| p3 -> e3
| ...
At first, I was rather upset with this, but I've come to appreciate
it, since it can in fact lead to rather better code for some complex
cases by making you think about what you're actually trying to do.
Then again, for the very simple cases like yours, it does indeed
get in the way a bit.
I still feel it may be a better choice, since in SML you can write:
fun foo a b = e1 a b
| foo c = e1 c
(for example.) This, IMO, can lead to some really strange confusion.
Anyway, the quick-n-dirty method of doing multiple patterns like
your example is to write:
let f a b = match (a,b) with
| (0, 0) -> 1
| (_, _) -> 0
But, this may very well have the overhead of actually building a
pair. You can also decompose it into something like:
let f = function
| 0 -> (function
| 0 -> 1
| _ -> 0)
| _ -> 0
Which is, yes, rather unattractive for such a small example.
Hope this helps,
John.
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
next prev parent reply other threads:[~2002-01-11 9:10 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <romildo@uber.com.br>
2002-01-08 13:08 ` José Romildo Malaquias
2002-01-08 13:16 ` Francois Thomasset
2002-01-08 13:18 ` Clement Renard
2002-01-08 13:26 ` John Prevost [this message]
2002-01-11 9:23 ` Xavier Leroy
2002-01-11 9:47 ` Andreas Rossberg
2002-01-08 13:30 ` Remi VANICAT
2002-01-09 13:28 ` [Caml-list] teil recursive function and GC Christophe Raffalli
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=20020108082639.A87628@libcom.com \
--to=jprevost@libcom.com \
--cc=caml-list@inria.fr \
--cc=romildo@uber.com.br \
/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