* Re: Seeking pratical tutorial or examples.
[not found] <20001019101803A.garrigue@kurims.kyoto-u.ac.jp>
@ 2000-10-19 19:02 ` Francisco Reyes
2000-10-19 23:55 ` multiple destructuring? Bruce Hoult
0 siblings, 1 reply; 3+ messages in thread
From: Francisco Reyes @ 2000-10-19 19:02 UTC (permalink / raw)
To: Jacques Garrigue; +Cc: caml-list
On Thu, 19 Oct 2000 10:18:03 +0900, Jacques Garrigue wrote:
>Caml-light has a wonderful example directory in the distribution.
>I join the README as attachment. Even as is, this can help you.
Thanks for the README.
Pierre mentioned he is going to port the examples to Ocaml.
>Actually, the only examples in the distribution is a few samples
>in the otherlibs/labltk subdirectory, that I'm afraid very few
>people really know about.
They also may not be a good entry point for total newcomers.
The examples from the CamlLight distribution seem like the right
type. Simple yet complete enough to see a combination of
different topics (loops, input from user, etc..).
>There are good reasons why Objective Caml documentation cannot match
>that of bigger projects,
Which are?
Need for more volunteers?
It is a cycle. The easier we make it for new people to join, the
more people we have to help with the documentation.
>but since plenty of examples are available,
>just making them easier to find would be a big help to beginner and
>intermediate programmers.
Yes. Much of the documentation would make much more sense if one
had a few examples to read. This is particularly the case for
the syntax of functions on the Standard Library (Chaper 19 of
the Ocaml Manual)
>
>Jacques Garrigue
>---------------------------------------------------------------------------
>Jacques Garrigue Kyoto University garrigue at kurims.kyoto-u.ac.jp
> <A HREF=http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/>JG</A>
>
francisco
Moderator of the Corporate BSD list
http://www.egroups.com/group/BSD_Corporate
^ permalink raw reply [flat|nested] 3+ messages in thread
* multiple destructuring?
2000-10-19 19:02 ` Seeking pratical tutorial or examples Francisco Reyes
@ 2000-10-19 23:55 ` Bruce Hoult
2000-10-20 12:18 ` Pierre Weis
0 siblings, 1 reply; 3+ messages in thread
From: Bruce Hoult @ 2000-10-19 23:55 UTC (permalink / raw)
To: caml-list
I'm just starting to play with OCaml and I wrote the following function:
let rec is_sorted lst =
match lst with
[] -> true
| [elt] -> true
| a :: b :: tail -> a<b & is_sorted(b :: tail)
I'm wondering whether the b :: tail actually allocates memory or is
the compiler smarter than that? What's the best way to avoid this?
If I rewrite to match instead with "a :: tail" (and then later pull
that apart into b :: more_tail) am I guaranteed that tail is
non-empty because of the prior [elt] case?
-- Bruce
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: multiple destructuring?
2000-10-19 23:55 ` multiple destructuring? Bruce Hoult
@ 2000-10-20 12:18 ` Pierre Weis
0 siblings, 0 replies; 3+ messages in thread
From: Pierre Weis @ 2000-10-20 12:18 UTC (permalink / raw)
To: Bruce Hoult; +Cc: caml-list
> I'm just starting to play with OCaml and I wrote the following function:
>
> let rec is_sorted lst =
> match lst with
> [] -> true
> | [elt] -> true
> | a :: b :: tail -> a<b & is_sorted(b :: tail)
>
>
> I'm wondering whether the b :: tail actually allocates memory or is
> the compiler smarter than that?
Yes it does, since you explicitely asked for it.
> What's the best way to avoid this?
Name the input sub-pattern (b :: tail) and use it in place of an
explicit call to "::" :
let rec is_sorted lst =
match lst with
| [] -> true
| [elt] -> true
| a :: (b :: tail as first_tail) -> a < b && is_sorted first_tail
> If I rewrite to match instead with "a :: tail" (and then later pull
> that apart into b :: more_tail) am I guaranteed that tail is
> non-empty because of the prior [elt] case?
Yes and no. If you write:
match lst with
| [] -> true
| [elt] -> true
| a :: tail -> ...
then you are guaranted that tail cannot be empty (this is witnessed by
the compiler that cheks it and does not emit any ``partial match''
warning).
However, if you further match the tail pattern in the right hand part
of the clause, the compiler ``forgets'' this fact and performs a new
exhaustivity check from scratch:
let rec is_sorted lst =
match lst with
| [] -> true
| [elt] -> true
| a :: tail ->
begin match tail with
| b :: t -> a < b && is_sorted tail
end;;
Warning: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
val is_sorted : 'a list -> bool = <fun>
Anyway, I would suggest a simpler solution to implement this function:
let rec is_sorted = function
| a :: (b :: _ as t) -> a < b && is_sorted t
| _ -> true;;
Best regards,
PS: If you allow duplicated elements in lists you should use <=
instead of < ...
Pierre Weis
INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2000-10-20 12:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20001019101803A.garrigue@kurims.kyoto-u.ac.jp>
2000-10-19 19:02 ` Seeking pratical tutorial or examples Francisco Reyes
2000-10-19 23:55 ` multiple destructuring? Bruce Hoult
2000-10-20 12:18 ` Pierre Weis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox