<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6115529230232389198</id><updated>2012-01-26T07:13:08.903-08:00</updated><category term='functionnal unparsing'/><category term='exception'/><category term='ocaml'/><category term='functionnal language'/><category term='phantom types'/><category term='type theoryocaml'/><category term='types'/><category term='type theory'/><title type='text'>PL diaries</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://till-varoquaux.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-3240345219227995079</id><published>2011-10-07T09:23:00.000-07:00</published><updated>2011-10-07T09:23:53.622-07:00</updated><title type='text'>Gdb debugging...</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Last month my &lt;a href="http://gael-varoquaux.info/blog/"&gt;brother&lt;/a&gt; came to visit and we did what every normal family would do: have beer and talk comp-scy. When he asked me how we debugged programs I had to sheepishly admit that I use printf... Part of the issue is that ocaml doesn't have good support for elf debugging annotation (the patch in &lt;a href="http://caml.inria.fr/mantis/view.php?id=4888"&gt;PR#4888&lt;/a&gt; hopes to address some of that) but it also comes from the fact that I am just not really up to speed on my debugging tools... Printf debugging has nearly no learning curve but it is slow and painful. Tools like gdb,strace,gprof,valgrind come with a steeper learning curve (especially for higher level languages because they require you to peer under the abstraction) but are the way to go in the long run.&lt;br /&gt;
&lt;br /&gt;
So this month is going to be the &lt;b&gt;no printf debugging month&lt;/b&gt; which means that I will only start modifying the source code of a programmer to debug it only as a last resort.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Meet the culprit&lt;/h1&gt;Today I had a quick look at a problem with the compiler itself. The compiler segfaulted while compiling code with very long lists (&lt;a href="http://caml.inria.fr/mantis/view.php?id=5368"&gt;PR#5368&lt;/a&gt;). &lt;br /&gt;
&lt;br /&gt;
The following bash command will generate a file (&lt;code&gt;big_list.ml&lt;/code&gt;) that will cause the failure:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;cat &lt;span style="color: #990000;"&gt;&amp;gt;&lt;/span&gt; big_list&lt;span style="color: #990000;"&gt;.&lt;/span&gt;ml &lt;span style="color: #990000;"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;b&gt;EOF&lt;/b&gt;
&lt;span style="color: #666666;"&gt;let big x =[&lt;/span&gt;
  &lt;span style="color: #990000;"&gt;$(&lt;/span&gt;yes &lt;span style="color: red;"&gt;"true;"&lt;/span&gt; &lt;span style="color: #990000;"&gt;|&lt;/span&gt; head -n &lt;span style="color: #993399;"&gt;100000&lt;/span&gt;&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;span style="color: #666666;"&gt; ]&lt;/span&gt;
&lt;b&gt;EOF&lt;/b&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h1&gt;Looking at backtraces&lt;/h1&gt;This smelled like a stack overflow (the stack size is fixed if you have too many function call chained you blow your stack out and might get a segfault). Sure enough, after raising the size of the stack (&lt;code&gt;ulimit -s 50000&lt;/code&gt;)  the compilation ran fine... So we are probably looking for a stack overflow. Those are usually called by non-tail call reccursions and real easy to find:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;load the binary in gdb. with &lt;code&gt; gdb --args ocamlopt.opt big_list.ml &lt;/code&gt; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;run it (&lt;code&gt;run&lt;/code&gt;) until it blows up &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;look at the stack (&lt;code&gt;bt&lt;/code&gt;) and one or several function should appear all the time.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;Using breakpoints&lt;/h1&gt;In my case the stacktrace was a bit anti climatic:  &lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;#0  0x000000000058150d in camlIdent__find_same_16167 ()
#1  0x0000000000000000 in ?? ()&lt;/tt&gt;&lt;/pre&gt;The lack of proper backtrace could be due to one of several things: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Ocamlopt's calling convention for function is not the same as C and this could throw of &lt;code&gt;gdb&lt;/code&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; the Ocaml run time has code to detect stack overflow (./asmrun/signals_asm.c). It works by registering a signal handler for the SIGSEGV signal and examining the address of the error and raising an exception if anything is wrong. This code is running inside a unix signal; this is a very restricted environment in which you are not allowed to do much (e.g. you cannot call malloc); it might be doing something illegal and/or messing up the stack.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;We did however get one function name out of it: &lt;code&gt;camlIdent__find_same_16167&lt;/code&gt;. The caml compiler assigns symbols to functions following this naming convention: caml&amp;lt;module name&amp;gt;__&amp;lt;function name&amp;gt;_&amp;lt;integer&amp;gt;. In this case the function is the &lt;code&gt;find_name&lt;/code&gt; function in the &lt;code&gt;Ident&lt;/code&gt;(typing/ident,ml) module. Let's have a look at who's calling this function by using break points.  No before calling &lt;code&gt;run&lt;/code&gt;in &lt;code&gt;gdb&lt;/code&gt; we set a breakpoint on the function.  &lt;/integer&gt;&lt;/function&gt;&lt;/module&gt;&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;
(gdb) break camlIdent__find_same_16167
Breakpoint 1 at 0x5814f0
(gdb) run
Starting program: /opt/ocaml-exp/bin/ocamlopt.opt big_list.ml

Breakpoint 1, 0x00000000005814f0 in camlIdent__find_same_16167 ()
&lt;/tt&gt;&lt;/pre&gt;We want to let cross this break point enough to have a nice a fat backtrace.  &lt;pre&gt;&lt;tt&gt;(gdb) ignore 1 500
Will ignore next 500 crossings of breakpoint 1.
(gdb) continue
Continuing.

Breakpoint 1, 0x00000000005814f0 in camlIdent__find_same_16167 ()
&lt;/tt&gt;&lt;/pre&gt;By looking at the backtrace we can now clearly see that: &lt;code&gt;camlTypecore__type_construct_206357&lt;/code&gt; is appearing a lot on the stack and, sure enough, the &lt;code&gt;type_construct&lt;/code&gt; in &lt;code&gt;typing/typecore.ml&lt;/code&gt; is not tail recursive. In our case the easiest solution is probably to change our code generator to output the list by chunks: &lt;pre&gt;let v0=[]

let v1= true::true:: ..... ::v0
let v2= true::true:: ..... ::v1
....
let v = vn
&lt;/pre&gt;&lt;h1&gt;Finding function's symbol&lt;/h1&gt;Last but not least: of you wanted to put a breakpoint in &lt;code&gt;typecore.ml&lt;/code&gt; on the function &lt;code&gt;type_argument&lt;/code&gt; you'd have to figure out the symbol name: &lt;pre&gt;&lt;tt&gt;&amp;gt; nm /opt/ocaml-exp/bin/ocamlopt.opt | grep camlTypecore__type_argument
0000000000526b70 T camlTypecore__type_argument_206355&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-3240345219227995079?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/3240345219227995079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/3240345219227995079'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2011/10/gdb-debugging.html' title='Gdb debugging...'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-2183382385188337543</id><published>2010-07-12T18:16:00.001-07:00</published><updated>2010-07-12T19:56:25.914-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functionnal unparsing'/><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='types'/><title type='text'>Command line parsing as a functional unparsing</title><content type='html'>Command line argument parsing is a puzzling subject: it seems simple and small enough that it wouldn&amp;#8217;t gather much attention yet it pops up regularly through the blogosphere. There are many libraries for argument parsing but none of them seem to be unanimously loved. This has all the hallmarks of a surprisingly sneaky (and thus interesting) problem.
A couple of long plane rides have allowed me to try taking a stab at argument parsing. This is however not intended to be a fully maintained and polished library; it is toy code used to test out a couple of ideas. The code uses a couple of clever tricks (functional unparsing, staging of functions, phantom types) but none of them are really new.  A seasoned ocaml programmers should be able to tackle all the concepts involved without much of a headache.
So, without further ado:
&lt;h2 id="_getting_started"&gt;Getting started&lt;/h2&gt;
We can usually see writing a command line interfaces as making one or several ocaml functions callable from the console (aka the entry points of our program).  The library we&amp;#8217;ve defined allows us to make those functions callable by giving a specification of their arguments (using functional unparsing).
Throughout this post we shall incrementally refine a given command line interface. Each of those refinement will be exposed through the command line as a separate functions
Our subject today is a basic &lt;tt&gt;cp&lt;/tt&gt; function which takes its arguments in reverse order (thus cp_into). It doesn&amp;#8217;t actually execute any action; instead it prints to stdout. We&amp;#8217;ll get into why we are not using a function with the arguments in the standard order for &lt;tt&gt;cp&lt;/tt&gt; soon.

&lt;pre&gt;&lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; cp_into
    &lt;span style="color: #990000"&gt;?(&lt;/span&gt;recursive&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;
    &lt;span style="color: #990000"&gt;?(&lt;/span&gt;force&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;dst&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;src&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Printf&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;printf "cp_into&lt;span style="color: #990000"&gt;\&lt;/span&gt;n&lt;span style="color: #990000"&gt;\&lt;/span&gt;
    recursive&lt;span style="color: #990000"&gt;:%&lt;/span&gt;b&lt;span style="color: #990000"&gt;\&lt;/span&gt;n&lt;span style="color: #990000"&gt;\&lt;/span&gt;
    force&lt;span style="color: #990000"&gt;:%&lt;/span&gt;b&lt;span style="color: #990000"&gt;\&lt;/span&gt;n&lt;span style="color: #990000"&gt;\&lt;/span&gt;
    &lt;span style="color: #990000"&gt;%&lt;/span&gt;s &lt;span style="color: #990000"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color: #990000"&gt;%&lt;/span&gt;s&lt;span style="color: #990000"&gt;\&lt;/span&gt;n"
    recursive
    force
    dst
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;String&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;concat &lt;span style="color: #FF0000"&gt;","&lt;/span&gt; src&lt;span style="color: #990000"&gt;)&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
Now that we know what we&amp;#8217;ll be working on we can start looking at how to define the command line interface. The main function we&amp;#8217;ll use is &lt;tt&gt;Unparse.choice&lt;/tt&gt; which takes two unlabelled arguments: A specification (of type &lt;tt&gt;Unparse.t&lt;/tt&gt;) which tells us which kind of command line arguments we expect and how to parse them and the function that we are embedding.  &lt;tt&gt;Unparse.choice&lt;/tt&gt; doesn&amp;#8217;t actually parse the arguments straight away: it actually creates a value that can be used to define command line interface with several sub commands (à la busybox,git,hg etc..). 
&lt;h2 id="_embedding_simple_functions"&gt;Embedding simple functions&lt;/h2&gt;
The simple specifications are very straightforwardly driven by the type of the functions we are embedding. We provide little more information than the type of the function and names of the arguments (used for documentation purposes)
&lt;pre&gt;&lt;tt&gt;
&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_fun &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt; dst srcs &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; cp_into dst srcs

&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;(* In this post we will gloss over the first parameter of the type `Unparse.t`&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;   it is a phantom type used to enforce some constraints on the specification. *)&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"tgt"&lt;/span&gt; &lt;span style="color: #990000"&gt;++&lt;/span&gt; non_empty_list &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"src"&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_choice &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice basic_spec
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:&lt;/span&gt;basic_fun
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"copy (without any flags)"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;name&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"cp_basic"&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
At this point I owe you an explanation: why did we not take the target as last argument like the unix &lt;tt&gt;cp&lt;/tt&gt; command?
&lt;h2 id="_a_note_on_the_argument_parsing_heuristic"&gt;A note on the argument parsing heuristic&lt;/h2&gt;
The parsers we build are &lt;a href="http://en.wikipedia.org/wiki/LL_parser"&gt;LL(1)&lt;/a&gt; parser. This means that there is no backtracking possible; if an operator successfully consumes an argument any solution that implies that operator failing will not even be considered
The &lt;tt&gt;list&lt;/tt&gt; operator is greedy and matches the longest possible list. If we had try to embed the classical &lt;tt&gt;cp&lt;/tt&gt; function. &lt;pre&gt;&lt;tt&gt;cp file... directory&lt;/tt&gt;&lt;/pre&gt; with the specification: &lt;pre&gt;&lt;tt&gt;list (string "file") ++ string "directory"&lt;/tt&gt;&lt;/pre&gt; this would have resulted in an unusable function (since the first the list (&lt;tt&gt;string ...&lt;/tt&gt;) would always have consumed all the remaining arguments).
&lt;pre&gt;&lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; cp &lt;span style="color: #990000"&gt;(&lt;/span&gt;_src&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;_tgt&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;(* This function is never going to get successfully called... *)&lt;/span&gt;&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;assert&lt;/span&gt;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;false&lt;/span&gt;&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; non_ll1_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;non_empty_list &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"src"&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="color: #990000"&gt;++&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"tgt"&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; non_ll1_choice &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice non_ll1_spec
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"broken will always fail because of the way the spec was defined"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:&lt;/span&gt;cp
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;name&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"cp_non_ll1"&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;h2 id="_simple_command_line_parsing_with_flags"&gt;Simple command line parsing with flags&lt;/h2&gt;
Specifications for flags with no arguments match simple boolean values; iff the flag is present on the command the specification evaluates to &lt;tt&gt;true&lt;/tt&gt; when parsing.
&lt;pre&gt;&lt;tt&gt;
&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_flag_fun &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt; recursive force dst src &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; cp_into &lt;span style="color: #990000"&gt;~&lt;/span&gt;recursive &lt;span style="color: #990000"&gt;~&lt;/span&gt;force dst src

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_flag_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t
    &lt;span style="color: #990000"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;
     bool_flag &lt;span style="color: #FF0000"&gt;"recursive"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"do a recursive copy"&lt;/span&gt;
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; bool_flag &lt;span style="color: #FF0000"&gt;"force"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"overwrite target without warning"&lt;/span&gt;
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"tgt"&lt;/span&gt;
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; non_empty_list &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"src"&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; basic_flag_choice &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice basic_flag_spec
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:&lt;/span&gt;basic_flag_fun
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"first attempt to have flags"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;name&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"cp_basic_flags"&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;h2 id="_more_flags"&gt;More flags&lt;/h2&gt;
At this point incremental rewrites of the same code are getting a bit tedious so I will introduce two concepts at once:
&lt;dl&gt;&lt;dt class="hdlist1"&gt;
Non-boolean flags
&lt;/dt&gt;&lt;dd&gt; will evaluate to &lt;tt&gt;Some&lt;/tt&gt; of a value when the flag is specified on the command line, This value can be produced by a specification that consumes an element from the command line&lt;/dd&gt;
&lt;dt class="hdlist1"&gt;Choice between flags
&lt;/dt&gt;&lt;dd&gt;When put between two flags (&lt;tt&gt;&amp;lt;!&amp;gt;&lt;/tt&gt;) this operator will return the value attached to the last flag specified on the command line. It can be chained used for more than two flags.&lt;/dd&gt;&lt;/dl&gt;
&lt;pre&gt;&lt;tt&gt;
&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; flag_fun &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt; recursive force dst src &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; cp_into &lt;span style="color: #990000"&gt;?&lt;/span&gt;recursive &lt;span style="color: #990000"&gt;?&lt;/span&gt;force dst src

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; recursive_flag_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;  'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;
    flag &lt;span style="color: #FF0000"&gt;"recursive"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"do a recursive copy"&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;
    &lt;span style="color: #990000"&gt;&amp;lt;!&amp;gt;&lt;/span&gt; flag &lt;span style="color: #FF0000"&gt;"no-recursive"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;""&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; force_flag_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;  'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;
   flag &lt;span style="color: #FF0000"&gt;"force"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"overwrite target without warning"&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;)&lt;/span&gt;
   &lt;span style="color: #990000"&gt;&amp;lt;!&amp;gt;&lt;/span&gt; flag &lt;span style="color: #FF0000"&gt;"no-force"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;""&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; flag_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #009900"&gt;option&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt;
       &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;  'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;recursive_flag_spec
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; force_flag_spec
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"tgt"&lt;/span&gt;
     &lt;span style="color: #990000"&gt;++&lt;/span&gt; non_empty_list &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"src"&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; flag_choice &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice flag_spec
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:&lt;/span&gt;flag_fun
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"first attempt to have flags"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;name&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"cp_into_with_flags"&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;h2 id="_labelling_arguments_of_the_called_function"&gt;Labelling arguments of the called function&lt;/h2&gt;
What we did above in order to call the function is that we mapped the function we were calling. This is still not a very satisfying solution because we would like to specify those labels locally when we define the spec. This is made possible by the interface which allows us to map the accumulator function locally.
&lt;pre&gt;&lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; final_spec &lt;span style="color: #990000"&gt;:&lt;/span&gt;
    &lt;span style="color: #990000"&gt;(&lt;/span&gt;_&lt;span style="color: #990000"&gt;,?&lt;/span&gt;recursive&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span style="color: #990000"&gt;?&lt;/span&gt;force&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #009900"&gt;bool&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #009900"&gt;list&lt;/span&gt;
      &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; 'a&lt;span style="color: #990000"&gt;,&lt;/span&gt;  'a&lt;span style="color: #990000"&gt;)&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t
    &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.(&lt;/span&gt;
    mapf &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:(&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt; f v &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; f &lt;span style="color: #990000"&gt;?&lt;/span&gt;recursive&lt;span style="color: #990000"&gt;:&lt;/span&gt;v&lt;span style="color: #990000"&gt;)&lt;/span&gt;
      &lt;span style="color: #990000"&gt;(&lt;/span&gt;flag &lt;span style="color: #FF0000"&gt;"recursive"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"do a recursive copy"&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;
    &lt;span style="color: #990000"&gt;++&lt;/span&gt; mapf &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:(&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt; f v &lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt; f &lt;span style="color: #990000"&gt;?&lt;/span&gt;force&lt;span style="color: #990000"&gt;:&lt;/span&gt;v&lt;span style="color: #990000"&gt;)&lt;/span&gt;
          &lt;span style="color: #990000"&gt;(&lt;/span&gt;flag &lt;span style="color: #FF0000"&gt;"force"&lt;/span&gt; &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"overwrite target without warning"&lt;/span&gt; &lt;span style="color: #990000"&gt;(&lt;/span&gt;const &lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;
    &lt;span style="color: #990000"&gt;++&lt;/span&gt; &lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"tgt"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;++&lt;/span&gt; non_empty_list &lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;string&lt;/span&gt; &lt;span style="color: #FF0000"&gt;"src"&lt;/span&gt;&lt;span style="color: #990000"&gt;))&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; final_choice &lt;span style="color: #990000"&gt;:&lt;/span&gt; &lt;span style="color: #009900"&gt;unit&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice  &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;choice final_spec
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;descr&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"Our last example function"&lt;/span&gt;
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;f&lt;span style="color: #990000"&gt;:&lt;/span&gt;cp_into
    &lt;span style="color: #990000"&gt;~&lt;/span&gt;name&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="color: #FF0000"&gt;"cp_final"&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;h2 id="_tying_it_all_together"&gt;Tying it all together&lt;/h2&gt;
All we need to make that command line interface is to actually tie all those commands (i.e. `choice`s) we&amp;#8217;ve defined together.

&lt;pre&gt;&lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #990000"&gt;()&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Unparse&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;multi_run &lt;span style="color: #990000"&gt;[&lt;/span&gt;
    basic_choice&lt;span style="color: #990000"&gt;;&lt;/span&gt;
    non_ll1_choice&lt;span style="color: #990000"&gt;;&lt;/span&gt;
    basic_flag_choice&lt;span style="color: #990000"&gt;;&lt;/span&gt;
    flag_choice&lt;span style="color: #990000"&gt;;&lt;/span&gt;
    final_choice
  &lt;span style="color: #990000"&gt;]&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;h2 id="_conclusion"&gt;Conclusion&lt;/h2&gt;
This is only a quick introduction to how this library can be used. If you want to understand what makes that library tick I invite you to read Olivier Danvy excellent article on functional unparsing.
Hacks like this one might seem as a purely academical exercise to some but getting familiar with tricks like the ones used here makes them cheaper to use and, in the long run, a sound investment. Argument parsing is a small enough problem that allows us to demonstrate those techniques.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-2183382385188337543?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/2183382385188337543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/2183382385188337543'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2010/07/command-line-parsing-as-functional.html' title='Command line parsing as a functional unparsing'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-4200266427396831011</id><published>2008-02-10T02:52:00.000-08:00</published><updated>2008-02-10T03:13:28.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phantom types'/><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><title type='text'>The power of doing nothing....</title><content type='html'>&lt;p&gt;There's an ongoing discussion on &lt;a class="externalLink" href= "http://www.cocan.org"&gt;COCAN&lt;/a&gt; on how to make errors explicit in function signatures (the proposed solution is to &lt;a class= "externalLink" href= "http://wiki.cocan.org/osr/exceptionless_error_management"&gt;go exceptionless&lt;/a&gt;). I will not delve on why I do not think this is a standard that should be adopted. Instead we will explore a very lightweight solutions that preserves the stack unwinding capability of exceptions whilst making the possible errors explicit in the signatures of the function.&lt;/p&gt; &lt;h2&gt;Basic types&lt;/h2&gt; &lt;p&gt;When one of our function is applied there we can have &lt;em&gt;either&lt;/em&gt; one of two possible outcomes: everything goes &lt;em&gt;right&lt;/em&gt; or we are &lt;em&gt;left&lt;/em&gt; over with an error (notice the cheap mnemonics). Now if we get rid of exceptions we want our return types to be able all this information. To do so we mimics Haskell's &lt;a class="externalLink" href= "http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3Aeither"&gt; either&lt;/a&gt; type:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;either&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;Left&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;of&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;|&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;Right&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;of&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'b&lt;/tt&gt;&lt;/div&gt; &lt;p&gt;In case you haden't caught my subtle hints &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style= "color: #009900"&gt;Right&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; is used to hold results and &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style= "color: #009900"&gt;Left&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; to hold errors.&lt;/p&gt; &lt;p&gt;For our short example we shall have a limited number of possible errors:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #990000"&gt;[&lt;/span&gt;`&lt;span style="color: #009900"&gt;Too_Small&lt;/span&gt;&lt;span style="color: #990000"&gt;|&lt;/span&gt;`&lt;span style="color: #009900"&gt;Too_Big&lt;/span&gt;&lt;span style="color: #990000"&gt;|&lt;/span&gt;`&lt;span style="color: #009900"&gt;Div_by_zero&lt;/span&gt;&lt;span style="color: #990000"&gt;|&lt;/span&gt;`&lt;span style="color: #009900"&gt;Some_other_error&lt;/span&gt;&lt;span style="color: #990000"&gt;]&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;p&gt;that can be thrown in an exception:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;exception&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;MyExc&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;of&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&lt;span style= "color: #990000"&gt;]&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;p&gt;(Allthough I may not be using any unsafe features of OCaml I am actually exploiting a bug in the type-checker here. The absence of this hack would make one of our functions a little less precise).&lt;/p&gt; &lt;h2&gt;External interface&lt;/h2&gt; &lt;p&gt;Ideally we'd want to choose functions should raise an exception or return a wrapped value. This choice has to be made at function application. Bearing this in mind our external interface is:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;External&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;sig&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;constraint&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style= "color: #990000"&gt;]&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;run&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'c&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'c&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;run_exn&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'c&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'c&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;either&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;h2&gt;Internal interface&lt;/h2&gt; &lt;p&gt;The idea behind this implementation is to use a phantom type attached to a value we shall pass along. This phantom type will be unified with every single single value we might raise thus acting as a "collector" for all the possible exceptions. Without further ado let proceed:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;Internal&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;sig&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;constraint&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style="color: #990000"&gt;]&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;constraint&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style= "color: #990000"&gt;]&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;create&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;unit&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;raise&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'b&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;return&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'b&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;lift&amp;nbsp;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'b&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;p&gt;The type &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;t&lt;/tt&gt;&lt;/span&gt; is our collector. It can only be created via the &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;create&lt;/tt&gt;&lt;/span&gt; function. &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;raise&lt;/tt&gt;&lt;/span&gt; and &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;return&lt;/tt&gt;&lt;/span&gt; are rather self explanatory, &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;lift&lt;/tt&gt;&lt;/span&gt; might come as more of a surprise: it is used to get the returned values from one our function. It ensures the possible errors of the called functions are unified with the "collector" of the callee. The internal interface does not expose functions like &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;External&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;run&lt;/tt&gt;&lt;/span&gt; because it discards the possible error cases.&lt;/p&gt; &lt;h2&gt;Implementation&lt;/h2&gt; &lt;p&gt;Our interfaces being set we will now present an implementation. It has been stated at the beginning of this post that we want it as lightweight as possible. Since we will (ab)use the identity functions let's get it out of the way:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;ident&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style= "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;i&lt;/tt&gt;&lt;/div&gt; &lt;p&gt;We are not using the more efficient external &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style= "color: #FF0000"&gt;"%identity"&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; function because it is, in essence, not type safe. If we consider that the unit value is a value that carries no information (the &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style= "color: #009900"&gt;unit&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; type being inhabited by only one value) and the identity function is a function that does nothing our implementation really doesn't do much:&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;Impl&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;struct&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;t&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900"&gt;unit&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;constraint&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style="color: #990000"&gt;]&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style= "color: #990000"&gt;,&lt;/span&gt;'b&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;value&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;'b&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;constraint&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;[&amp;lt;&lt;/span&gt;&amp;nbsp;possible_exc&amp;nbsp;&lt;span style= "color: #990000"&gt;]&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;create&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;ident&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;raise&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;raise&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;&lt;span style= "color: #009900"&gt;MyExc&lt;/span&gt;&amp;nbsp;e&lt;span style= "color: #990000"&gt;)&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;return&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;ident&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;run&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;ident&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;lift&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;ident&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;run_exn&amp;nbsp;f&amp;nbsp;v&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;try&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900"&gt;Right&lt;/span&gt;&amp;nbsp;&lt;span style="color: #990000"&gt;(&lt;/span&gt;f&amp;nbsp;v&lt;span style="color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;with&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900"&gt;MyExc&lt;/span&gt;&amp;nbsp;v&amp;nbsp;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900"&gt;Left&lt;/span&gt;&amp;nbsp;v&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;h2&gt;Excercising it&lt;/h2&gt; &lt;p&gt;Let's take our shiny new modules for a test run. The types commented are the inferred types and thus the most general ones.&lt;/p&gt; &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt; &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;I&lt;/span&gt;&lt;span style= "color: #990000"&gt;:&lt;/span&gt;&lt;span style= "color: #009900"&gt;Internal&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #009900"&gt;Impl&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;(*&amp;nbsp;int&amp;nbsp;-&amp;gt;&amp;nbsp;([&amp;lt;&amp;nbsp;possible_exc&amp;nbsp;&amp;gt;&amp;nbsp;`Too_Big&amp;nbsp;`Too_Small&amp;nbsp;],&amp;nbsp;unit)&amp;nbsp;I.value&amp;nbsp;*)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;check_range&amp;nbsp;i&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;create&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;if&lt;/span&gt;&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style= "color: #990000"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #993399"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style="color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;raise&amp;nbsp;t&amp;nbsp;`&lt;span style="color: #009900"&gt;Too_Big&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;else&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;if&lt;/span&gt;&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style= "color: #990000"&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #990000"&gt;-&lt;/span&gt;&lt;span style= "color: #993399"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style="color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;raise&amp;nbsp;t&amp;nbsp;`&lt;span style="color: #009900"&gt;Too_Small&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style="color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;return&amp;nbsp;t&amp;nbsp;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;(*&amp;nbsp;'a&amp;nbsp;-&amp;gt;&amp;nbsp;int&amp;nbsp;-&amp;gt;&amp;nbsp;([&amp;lt;&amp;nbsp;possible_exc&amp;nbsp;&amp;gt;&amp;nbsp;`Div_by_zero&amp;nbsp;],&amp;nbsp;int)&amp;nbsp;I.value&amp;nbsp;*)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;div&amp;nbsp;x&amp;nbsp;y&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;create&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;if&lt;/span&gt;&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "color: #993399"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style="color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;raise&amp;nbsp;t&amp;nbsp;`&lt;span style="color: #009900"&gt;Div_by_zero&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style="color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;return&amp;nbsp;t&amp;nbsp;&lt;span style="color: #993399"&gt;0&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;(*&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;&amp;nbsp;int&amp;nbsp;-&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;&amp;nbsp;int&amp;nbsp;-&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;&amp;nbsp;([&amp;lt;&amp;nbsp;possible_exc&amp;nbsp;&amp;gt;&amp;nbsp;`Div_by_zero&amp;nbsp;`Too_Big&amp;nbsp;`Too_Small&amp;nbsp;],&amp;nbsp;int)&amp;nbsp;I.value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-style: italic"&gt;&lt;span style= "color: #9A1900"&gt;*)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;div_in_range&amp;nbsp;x&amp;nbsp;y&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;create&amp;nbsp;&lt;span style= "color: #990000"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;lift&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;check_range&amp;nbsp;x&lt;span style= "color: #990000"&gt;);&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;lift&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;check_range&amp;nbsp;y&lt;span style= "color: #990000"&gt;);&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;return&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;&lt;span style= "font-weight: bold"&gt;&lt;span style= "color: #000080"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style= "color: #990000"&gt;.&lt;/span&gt;lift&amp;nbsp;e&amp;nbsp;&lt;span style= "color: #990000"&gt;(&lt;/span&gt;div&amp;nbsp;x&amp;nbsp;y&lt;span style= "color: #990000"&gt;))&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt; &lt;h2&gt;Conclusion&lt;/h2&gt; &lt;p&gt;Even though this actually works it does not scale well to multiple modules. It should be considered as a proof of concept rather than serious code.&lt;/p&gt; &lt;p&gt;As there name imply exception should be used to handle exceptional cases. A well designed library should only throw exception when it encounters an error or a bug. Exception should only be used for error recovery (they might be used internally for hacks such as bugtracking but should never trickle out of the library). It seems cumbersome to impose the callee of library functions to handle a long trail of more and more exotic error cases.&lt;/p&gt; &lt;p&gt;If one really desires to have explicit error handling combining our &lt;span style= "background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;either&lt;/tt&gt;&lt;/span&gt; type with &lt;a class="externalLink" href= "http://sigfpe.blogspot.com/2006/08/you-could-have-invented-monads-and.html"&gt; monads&lt;/a&gt; seems to be the sane route. This is exactly what the haskell &lt;a class="externalLink" href= "ttp://www.haskell.org/ghc/docs/6.2.2/html/libraries/base/Control.Monad.Error.html"&gt; error monad&lt;/a&gt; does.&lt;/p&gt; &lt;p&gt;Talking about haskell, an interesting read is &lt;a class= "externalLink" href= "http://www.randomhacks.net/articles/2007/03/10/haskell-8-ways-to-report-errors"&gt; 8 ways to report errors in Haskell&lt;/a&gt;. It gives a good overview on how messy and uncoherent error reporting can get.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-4200266427396831011?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://till-varoquaux.blogspot.com/feeds/4200266427396831011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6115529230232389198&amp;postID=4200266427396831011' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/4200266427396831011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/4200266427396831011'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2008/02/power-of-doing-nothing.html' title='The power of doing nothing....'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-8826345697676423596</id><published>2007-11-27T20:53:00.000-08:00</published><updated>2007-11-27T21:05:47.624-08:00</updated><title type='text'>Bilingual "hello world"</title><content type='html'>&lt;p&gt;Here is a fun (and slightly useless) hack:&lt;/p&gt;&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;#cd &lt;span style="color: #FF0000"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;(*&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;echo &amp;quot;Hello world&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;&amp;lt;&amp;lt;&amp;quot;OCAMLCODE_END&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;*)&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #990000"&gt;()&lt;/span&gt; &lt;span style="color: #990000"&gt;=&lt;/span&gt; print_endline &lt;span style="color: #FF0000"&gt;&amp;quot;Bonjour le monde&amp;quot;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;(*&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;OCAMLCODE_END&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;span style="color: #9A1900"&gt;#*)&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;p&gt;This program is both a shell program and an ocaml program. If you run it using &lt;em&gt;sh&lt;/em&gt; it will print &amp;quot;Hello world&amp;quot; but if you run it in &lt;em&gt;ocaml&lt;/em&gt; it will output &amp;quot;Bonjour le monde&amp;quot; (Ocaml is a french programming language after all).&lt;/p&gt;&lt;p&gt;There is actually a small interest in this hack: suppose you want to run an ocaml script but need to make a couple of checks before running it (for instance checking whether &lt;a class="externalLink" href="http://www.ocaml-programming.de/programming/findlib.html"&gt;findlib&lt;/a&gt; is installed or the interpreter is recent enough) you can now bundle it as a shell executable that calls itself again after having done the checks as an ocaml program. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-8826345697676423596?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://till-varoquaux.blogspot.com/feeds/8826345697676423596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6115529230232389198&amp;postID=8826345697676423596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/8826345697676423596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/8826345697676423596'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2007/11/bilingual-hello-world.html' title='Bilingual &quot;hello world&quot;'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-4601703545678042780</id><published>2007-06-24T07:34:00.000-07:00</published><updated>2007-06-26T10:41:57.760-07:00</updated><title type='text'>Preserving atomicity in IO operations</title><content type='html'>&lt;p&gt;[Updated 26/07/07: &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;unwind_protect&lt;/tt&gt;&lt;/span&gt; now captures less variables.]&lt;/p&gt;
    &lt;p&gt;There are a bunch of operation that must be executed in pairs, for instance openned channel SHOULD be closed. That is: every call to an &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;open_in&lt;/tt&gt;&lt;/span&gt; on a file should be followed by a subsequent &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;close_in&lt;/tt&gt;&lt;/span&gt; on the openned channel.&lt;/p&gt;
    &lt;h2&gt;Edging towards a solution:&lt;/h2&gt;
    &lt;p&gt;Lispers actually have a neat way atomicity of file descriptor operations. &lt;a class="externalLink" href="http://www.cs.queensu.ca/software_docs/gnudev/gcl-ansi/gcl_1192.html"&gt;with-open-file&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;&lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;with_open_file&lt;/tt&gt;&lt;/span&gt; takes the name of the file to and a function working on the file handle, this function should not close the file handle. A first shot would look like:&lt;/p&gt;
    &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
      &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;with_open_in&amp;#xA0;file&amp;#xA0;f&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;ic&lt;span style="color: #990000"&gt;=&lt;/span&gt;open_in&amp;#xA0;file&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;res&lt;span style="color: #990000"&gt;=&lt;/span&gt;f&amp;#xA0;ic&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;close_in&amp;#xA0;ic&lt;span style="color: #990000"&gt;;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;res&lt;/tt&gt;
    &lt;/div&gt;
    &lt;p&gt;Although at a first glance this looks ok it will break down if an exception is raised in &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;f&lt;/tt&gt;&lt;/span&gt;. We will now introduce a new function from the lisp world. &lt;a class="externalLink" href="http://www.cs.queensu.ca/software_docs/gnudev/gcl-ansi/gcl_385.html"&gt;unwind-protect&lt;/a&gt;&lt;/p&gt;
    &lt;h2&gt;Unwind-protect:&lt;/h2&gt;
    &lt;p&gt;&lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;unwind_protect&lt;/tt&gt;&lt;/span&gt; takes two functions, the second one being a cleanup function. &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;unwind_protect&amp;#xA0;f&amp;#xA0;cleanup&lt;/tt&gt;&lt;/span&gt; returns the result of running &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;f&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;. Whatever happens in &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;f&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;, &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;cleanup&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; will be called.&lt;/p&gt;
    &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
      &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;unwind_protect&amp;#xA0;f&amp;#xA0;g&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;run&amp;#xA0;f&amp;#xA0;&lt;span style="color: #990000"&gt;()=&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;match&lt;/span&gt;&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;!&lt;/span&gt;f&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;with&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&lt;span style="color: #990000"&gt;|&lt;/span&gt;&amp;#xA0;&lt;span style="color: #009900"&gt;Some&lt;/span&gt;&amp;#xA0;f&amp;#xA0;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;#xA0;f&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&lt;span style="color: #990000"&gt;|&lt;/span&gt;&amp;#xA0;&lt;span style="color: #009900"&gt;None&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;closeFun&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="color: #009900"&gt;ref&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="color: #009900"&gt;Some&lt;/span&gt;&amp;#xA0;g&lt;span style="color: #990000"&gt;)&lt;/span&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;at_exit&amp;#xA0;&lt;span style="color: #990000"&gt;(&lt;/span&gt;run&amp;#xA0;closeFun&lt;span style="color: #990000"&gt;);&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;res&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;f&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;with&lt;/span&gt;&lt;/span&gt;&amp;#xA0;e&amp;#xA0;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;g&amp;#xA0;&lt;span style="color: #990000"&gt;();&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;raise&amp;#xA0;e&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;closeFun&amp;#xA0;&lt;span style="color: #990000"&gt;:=&lt;/span&gt;&amp;#xA0;&lt;span style="color: #009900"&gt;None&lt;/span&gt;&lt;span style="color: #990000"&gt;;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;g&amp;#xA0;&lt;span style="color: #990000"&gt;();&lt;/span&gt;&lt;br/&gt;&amp;#xA0;res&lt;/tt&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;with_open_file&lt;/tt&gt;&lt;/span&gt; can now be coded as:&lt;/p&gt;
    &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
      &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;with_open_in&amp;#xA0;filename&amp;#xA0;f&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;ch&lt;span style="color: #990000"&gt;=&lt;/span&gt;open_in&amp;#xA0;filename&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;unwind_protect&amp;#xA0;&lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;#xA0;f&amp;#xA0;ch&lt;span style="color: #990000"&gt;)&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;fun&lt;/span&gt;&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;()&lt;/span&gt;&amp;#xA0;&lt;span style="color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;#xA0;close_in&amp;#xA0;ch&lt;span style="color: #990000"&gt;)&lt;/span&gt;&lt;/tt&gt;
    &lt;/div&gt;
    &lt;h2&gt;Wrapping it up:&lt;/h2&gt;
    &lt;p&gt;We now would like to force the usage of our new functions instead of the old ones. We do not want to define a new type of channel and there is no way to 'hide' them from &lt;span style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;&lt;span style="color: #009900"&gt;Pervasives&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;, we can however override the functions we don't want to allow with an abstract type:&lt;/p&gt;
    &lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
      &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;#xA0;&lt;span style="color: #009900"&gt;Abstract&lt;/span&gt;&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;sig&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;#xA0;t&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;#xA0;v&lt;span style="color: #990000"&gt;:&lt;/span&gt;t&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;struct&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;#xA0;t&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="color: #009900"&gt;unit&lt;/span&gt;&lt;br/&gt;&amp;#xA0;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;v&lt;span style="color: #990000"&gt;=()&lt;/span&gt;&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;open_out&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;v&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;open_in&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;v&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;close_out&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;v&lt;br/&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;#xA0;close_in&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;v&lt;/tt&gt;
    &lt;/div&gt;
    &lt;h2&gt;Conclusion:&lt;/h2&gt;
    &lt;p&gt;This looks like yet another modification one could wish for in OCaml standard library. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-4601703545678042780?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://till-varoquaux.blogspot.com/feeds/4601703545678042780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6115529230232389198&amp;postID=4601703545678042780' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/4601703545678042780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/4601703545678042780'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2007/06/preserving-atomicity-in-io-operations.html' title='Preserving atomicity in IO operations'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6115529230232389198.post-8604539241062949032</id><published>2007-06-03T14:51:00.000-07:00</published><updated>2007-06-04T04:44:27.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phantom types'/><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='type theory'/><category scheme='http://www.blogger.com/atom/ns#' term='functionnal language'/><category scheme='http://www.blogger.com/atom/ns#' term='type theoryocaml'/><title type='text'>Phun with phantom types!!</title><content type='html'>&lt;p&gt;Phantom types are a nifty trick: types are used to store additional
information during the type-checking pass. These types have no
implementations (there are no values actually having these types) but are
still used as type parameter to tag values. This additional info is then used
by the type system to statically ensure some conditions are met. As, I'm
guessing this is all getting rather intriguing (or confusing) I propose to
step through a very simple example.&lt;/p&gt;

&lt;h2&gt;Without phantom types&lt;/h2&gt;

&lt;p&gt;Let's start out with a very basic library to handle lists:&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;&lt;span style="font-style: italic"&gt;&lt;span style=
  "color: #9A1900"&gt;(*The&amp;nbsp;empty&amp;nbsp;list*)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;=[]&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-style: italic"&gt;&lt;span style=
  "color: #9A1900"&gt;(*Appends&amp;nbsp;an&amp;nbsp;element&amp;nbsp;in&amp;nbsp;front&amp;nbsp;of&amp;nbsp;a&amp;nbsp;list*)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;cons&amp;nbsp;e&amp;nbsp;l&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #990000"&gt;::&lt;/span&gt;l&lt;br&gt;
  &lt;span style="font-style: italic"&gt;&lt;span style=
  "color: #9A1900"&gt;(*Converts&amp;nbsp;two&amp;nbsp;list&amp;nbsp;of&amp;nbsp;same&amp;nbsp;sizes&amp;nbsp;to&amp;nbsp;a&amp;nbsp;list&amp;nbsp;of&amp;nbsp;couples&amp;nbsp;*)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;combine&amp;nbsp;&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;combine&lt;/tt&gt;
&lt;/div&gt;

&lt;p&gt;Combine needs both of its arguments to be of the same length. This is
typically a job for &lt;a class="externalLink" href=
"http://en.wikipedia.org/wiki/Dependent_type"&gt;dependent types&lt;/a&gt; (i.e. types
depending on a value) where list length would be encoded in their types.
Ocaml doesn't have dependant type but we'll see how to leverage the type
inference mechanism to encode lengths.&lt;/p&gt;

&lt;h2&gt;Encoding the length&lt;/h2&gt;

&lt;p&gt;Since our types cannot contain values we need to find a way to code
integers in our type system. We will using an encoding based on &lt;a class=
"externalLink" href=
"http://en.wikipedia.org/wiki/Peano_axioms#Peano.27s_axioms"&gt;Peano's
axiom's&lt;/a&gt;:&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;zero&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'length&amp;nbsp;succ&lt;/tt&gt;
&lt;/div&gt;

&lt;p&gt;0 is represented by the type &lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;zero&lt;/tt&gt;&lt;/span&gt;, 1 by
&lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;succ&amp;nbsp;zero&lt;/tt&gt;&lt;/span&gt;,
2 by &lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;succ&amp;nbsp;succ&amp;nbsp;zero&lt;/tt&gt;&lt;/span&gt;
etc... There exist no values having these types: they are empty.&lt;/p&gt;

&lt;h2&gt;Using the phantom type&lt;/h2&gt;

&lt;p&gt;The previous type will be the "phantom type": it will be used to encode
additional info but won't represent the type of any actual object.&lt;/p&gt;

&lt;p&gt;The idea here is to make our lists depend on that type to store the length
info. Instead of being &lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;'a&amp;nbsp;&lt;span style=
"color: #009900"&gt;list&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt; our list type is now:&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;/tt&gt;
&lt;/div&gt;

&lt;p&gt;where &lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;'length&lt;/tt&gt;&lt;/span&gt;
represents the length of the list. Giving types to our previous functions is
now straightforward:&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;:(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;zero&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;cons&lt;span style=
  "color: #990000"&gt;:&lt;/span&gt;'a&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,(&lt;/span&gt;'length&amp;nbsp;succ&lt;span style=
  "color: #990000"&gt;))&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;combine&lt;span style=
  "color: #990000"&gt;:(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'b&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;((&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;*&lt;/span&gt;'b&lt;span style=
  "color: #990000"&gt;),&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;/tt&gt;
&lt;/div&gt;

&lt;p&gt;and since under the hood we are using standard OCaml's list, converting
from our list to a normal list is a plain identity. We'll now wrap everything
in a nice module in order to hide the internals:&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;module&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #009900"&gt;DepList&lt;/span&gt;&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;sig&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;zero&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'length&amp;nbsp;succ&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;:(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;zero&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;cons&lt;span style=
  "color: #990000"&gt;:&lt;/span&gt;'a&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,(&lt;/span&gt;'length&amp;nbsp;succ&lt;span style=
  "color: #990000"&gt;))&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;toList&lt;span style=
  "color: #990000"&gt;:(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;'a&amp;nbsp;&lt;span style=
  "color: #009900"&gt;list&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;combine&lt;span style=
  "color: #990000"&gt;:(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'b&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;((&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;*&lt;/span&gt;'b&lt;span style=
  "color: #990000"&gt;),&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;struct&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;zero&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;'b&amp;nbsp;succ&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;'a&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;'length&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;t&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;'a&amp;nbsp;&lt;span style=
  "color: #009900"&gt;list&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;=[]&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;cons&amp;nbsp;e&amp;nbsp;l&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #990000"&gt;::&lt;/span&gt;l&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;combine&amp;nbsp;&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;combine&lt;br&gt;
  &amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;toList&amp;nbsp;l&amp;nbsp;&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;l&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt;
&lt;/div&gt;

&lt;h2&gt;Testing it all&lt;/h2&gt;

&lt;p&gt;And it's now time to play with our library...&lt;/p&gt;

&lt;div style="background:#e6e6e6;border:1px solid #a0a0a0;"&gt;
  &lt;tt&gt;#&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;open&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #009900"&gt;DepList&lt;/span&gt;&lt;span style="color: #990000"&gt;;;&lt;/span&gt;&lt;br&gt;
  #&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;a&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;cons&amp;nbsp;&lt;span style=
  "color: #993399"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;cons&amp;nbsp;&lt;span style=
  "color: #993399"&gt;6&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;);;&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;span style=
  "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;&lt;span style=
  "color: #009900"&gt;int&lt;/span&gt;&lt;span style="color: #990000"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;zero&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;succ&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;succ&lt;span style="color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style="color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #990000"&gt;.&lt;/span&gt;t&amp;nbsp;&lt;span style="color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #990000"&gt;&amp;lt;&lt;/span&gt;abstr&lt;span style="color: #990000"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
  #&amp;nbsp;toList&amp;nbsp;a&lt;span style="color: #990000"&gt;;;&lt;/span&gt;&lt;br&gt;
  &lt;span style="color: #990000"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #009900"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #009900"&gt;list&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;[&lt;/span&gt;&lt;span style="color: #993399"&gt;5&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #993399"&gt;6&lt;/span&gt;&lt;span style="color: #990000"&gt;]&lt;/span&gt;&lt;br&gt;
  #&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;let&lt;/span&gt;&lt;/span&gt;&amp;nbsp;b&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;cons&amp;nbsp;&lt;span style=
  "color: #FF0000"&gt;"a"&lt;/span&gt;&amp;nbsp;nil&lt;span style=
  "color: #990000"&gt;;;&lt;/span&gt;&lt;br&gt;
  &lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;val&lt;/span&gt;&lt;/span&gt;&amp;nbsp;b&amp;nbsp;&lt;span style=
  "color: #990000"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;&lt;span style=
  "color: #009900"&gt;string&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;zero&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;succ&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;t&amp;nbsp;&lt;span style=
  "color: #990000"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;&amp;lt;&lt;/span&gt;abstr&lt;span style=
  "color: #990000"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
  #&amp;nbsp;combine&amp;nbsp;a&amp;nbsp;b&lt;span style="color: #990000"&gt;;;&lt;/span&gt;&lt;br&gt;
  &lt;span style="color: #009900"&gt;Characters&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #993399"&gt;10&lt;/span&gt;&lt;span style="color: #990000"&gt;-&lt;/span&gt;&lt;span style=
  "color: #993399"&gt;11&lt;/span&gt;&lt;span style="color: #990000"&gt;:&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&amp;nbsp;combine&amp;nbsp;a&amp;nbsp;b&lt;span style="color: #990000"&gt;;;&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;^&lt;/span&gt;&lt;br&gt;
  &lt;span style=
  "color: #009900"&gt;This&lt;/span&gt;&amp;nbsp;expression&amp;nbsp;has&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "color: #990000"&gt;(&lt;/span&gt;&lt;span style=
  "color: #009900"&gt;string&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;zero&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;succ&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;t&lt;br&gt;
  but&amp;nbsp;is&amp;nbsp;here&amp;nbsp;used&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #0000FF"&gt;with&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style="color: #0000FF"&gt;type&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
  &amp;nbsp;&amp;nbsp;&lt;span style="color: #990000"&gt;(&lt;/span&gt;&lt;span style=
  "color: #009900"&gt;string&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;zero&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;succ&amp;nbsp;&lt;span style=
  "font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;succ&lt;span style=
  "color: #990000"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="font-weight: bold"&gt;&lt;span style=
  "color: #000080"&gt;DepList&lt;/span&gt;&lt;/span&gt;&lt;span style=
  "color: #990000"&gt;.&lt;/span&gt;t&lt;/tt&gt;
&lt;/div&gt;

&lt;p&gt;That's right we've just statically caught an error because &lt;span style=
"background:#e6e6e6;border:1px solid #a0a0a0;"&gt;&lt;tt&gt;combine&lt;/tt&gt;&lt;/span&gt; was
called with two lists of different lengths!&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Phantom types are a fun hack to play with, alas they are very restrictive
and rarely useful. Their big brothers (&lt;a class="externalLink" href=
"http://www.haskell.org/ghc/docs/6.4/html/users_guide/gadt.html"&gt;GADT's&lt;/a&gt;
and dependant types) require specific type systems and are tricky to
groke.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6115529230232389198-8604539241062949032?l=till-varoquaux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://till-varoquaux.blogspot.com/feeds/8604539241062949032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6115529230232389198&amp;postID=8604539241062949032' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/8604539241062949032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6115529230232389198/posts/default/8604539241062949032'/><link rel='alternate' type='text/html' href='http://till-varoquaux.blogspot.com/2007/06/phun-with-phantom-types.html' title='Phun with phantom types!!'/><author><name>Till</name><uri>http://www.blogger.com/profile/00819360231165992892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='32' src='http://2.bp.blogspot.com/-P17ClD1mtjk/To9KPss-StI/AAAAAAAAAWk/4VjSBvdJFWE/s220/276047_597502158_1874686_n.jpg'/></author><thr:total>4</thr:total></entry></feed>
