Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Function definition with multiple patterns in multiple equations
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: John Prevost <jprevost@l...>
Subject: Re: [Caml-list] Function definition with multiple patterns in multiple equations
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