[cwn] Attn: Development Editor, Latest Caml Weekly News
Alan Schmitt
alan.schmitt at polytechnique.org
Tue Jan 24 08:26:31 PST 2012
Hello,
Here is the latest Caml Weekly News, for the week of January 17 to 24,
2012.
1) otags reloaded 3.12.1 for OCaml 3.12.1
2) ounit v1.1.1: Unit testing framework
3) polymorphic variants in match statements
4) Other Caml News
========================================================================
1) otags reloaded 3.12.1 for OCaml 3.12.1
Archive:
<https://sympa-roc.inria.fr/wws/arc/caml-list/2012-01/msg00154.html>
------------------------------------------------------------------------
** Hendrik Tews announced:
better late than never: I would like to announce the first
release of otags reloaded for OCaml 3.12. It is available at
<http://askra.de/software/otags/>
Otags reloaded generates tags tables for emacs and vi/vim.
Note that otags (by default) refuses to compile with OCaml
3.12.0, because that version contains a bug that makes otags
quite unusable.
Otags reloaded is distributed under GPL v3.
========================================================================
2) ounit v1.1.1: Unit testing framework
Archive:
<https://sympa-roc.inria.fr/wws/arc/caml-list/2012-01/msg00157.html>
------------------------------------------------------------------------
** Sylvain Le Gall announced:
OUnit is a unit testing framework for OCaml, inspired by the JUnit tool
for
Java, and the HUnit tool for Haskell.
More information on [HUnit](<http://hunit.sourceforge.net>)
In version 1.1.1:
- bracket now enforce returning unit
- update examples
- ListSimpleMake now use the provided comparator for all elements
This version is already available on oasis-db (and can be installed
through
odb):
<http://oasis.ocamlcore.org/dev/view/ounit/1.1.1>
Homepage:
<http://ounit.forge.ocamlcore.org>
Get source code:
$ darcs get <http://darcs.ocamlcore.org/repos/ounit>
Browse source code:
<http://darcs.ocamlcore.org/cgi-bin/darcsweb.cgi?r=ounit;a=summary>
========================================================================
3) polymorphic variants in match statements
Archive:
<https://sympa-roc.inria.fr/wws/arc/caml-list/2012-01/msg00206.html>
------------------------------------------------------------------------
** Milan Stanojevi? asked and Jacques Garrigue replied:
> Hi, we're trying to understand the type inference with polymorphic
> variants in match statements. This is a simplification of an actual
> case that happened in practice.
>
> 1)
> let f i a =
> match i, a with
> | true, `A -> `B
> | false, x -> x
>
> fails with
> File "foo.ml", line 4, characters 16-17:
> Error: This expression has type [< `A ]
> but an expression was expected of type [> `B ]
> The first variant type does not allow tag(s) `B
>
> 2) changing false to _
> let f i a =
> match i, a with
> | true, `A -> `B
> | _, x -> x
>
> this succeeds with
> val f : bool -> ([> `A | `B ] as 'a) -> 'a
>
> 3) changing x in (1) to _ , and using a on the right side
> let f i a =
> match i, a with
> | true, `A -> `B
> | false, _ -> a
>
> this fails in the same way as (1)
>
> 4) finally adding another case to match statement
> let f i a =
> match i, a with
> | true, `A -> `B
> | false, x -> x
> | true, x -> x
>
> this succeeds with the same type as (2)
>
>
> So it seems there is some interaction between type inference and
> exhaustivnest of the match statements.
>
> Can someone shed some light on what is going on here?
Indeed. The basic idea is to close variant types when leaving them
open would make the pattern matching non-exhaustive.
Here, if we assume that a has type [`A | `B], then the pattern-matching
becomes non-exhaustive, so the type inferred is just [`A]
(i.e. the list of all constructors appearing inside the patterns at this
position).
Actually, the theory is a bit more complicated, and the full details are
in the following paper, but you should just expect the above behavior
in practice.
Typing deep pattern-matching in presence of polymorphic
variants.
<http://www.math.nagoya-u.ac.jp/~garrigue/papers/index.html>
Note that there is also another way to make (1) type, without adding
new cases
let f i a =
match i, a with
| true, `A -> `B
| false, (`A as x) -> x;;
val f : bool -> [< `A ] -> [> `A | `B ] = <fun>
Here we have removed the connection between a and the output,
allowing `A to be combine with `B without changing the type of a.
========================================================================
4) Other Caml News
------------------------------------------------------------------------
** From the ocamlcore planet blog:
Thanks to Alp Mestan, we now include in the Caml Weekly News the links
to the
recent posts from the ocamlcore planet blog at
<http://planet.ocamlcore.org/>.
libsndfile:
<https://forge.ocamlcore.org/projects/libsndfile/>
OCaml Submodule Pattern:
<http://www.nicollet.net/2012/01/ocaml-submodule-pattern/>
OUnit 1.1.1:
<http://caml.inria.fr/cgi-bin/hump.cgi?contrib=293>
Otags 3.12.1:
<http://caml.inria.fr/cgi-bin/hump.cgi?contrib=294>
A puzzle about typing:
<http://math.andrej.com/2012/01/20/a-puzzle-about-typing/>
Happy new year from the Ocsigen team:
<http://ocsigen.org/>
1D integration:
<https://forge.ocamlcore.org/projects/integration1d/>
Share your mistakes: adventures in optimization:
<http://blog.incubaid.com/2012/01/17/share-your-mistakes-adventures-in-optimization/>
========================================================================
Old cwn
------------------------------------------------------------------------
If you happen to miss a CWN, you can send me a message
(alan.schmitt at polytechnique.org) and I'll mail it to you, or go take a
look at
the archive (<http://alan.petitepomme.net/cwn/>) or the RSS feed of the
archives (<http://alan.petitepomme.net/cwn/cwn.rss>). If you also wish
to receive it every week by mail, you may subscribe online at
<http://lists.idyll.org/listinfo/caml-news-weekly/> .
========================================================================
More information about the caml-news-weekly
mailing list