<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom">
<title>Phil Dawes Stuff: ml</title>
<id>http://phildawes.net/blog//tag/ml/</id>
<link rel="alternate" type="text/html" href="http://phildawes.net/blog//tag/ml/" />
<link rel="self" type="application/atom+xml" href="http://phildawes.net/blog//tag/ml/atom.xml" />
<author><name>Phil Dawes</name></author>
<updated>2006-08-29T12:10:00Z</updated>


<entry>
  <title type="html">Currying</title>
  
  <category term="General" /> 
  <category term="ml" /> 
  <category term="ocaml" /> 
  <category term="programming" /> 
  <category term="workfriendly" />
  <id>http://phildawes.net/blog/2006/08/29/currying/</id>
  <updated>2006-08-29T12:10:00Z</updated>
  <published>2006-08-29T12:10:00Z</published>
  <link rel="alternate" type="text/html" href="http://phildawes.net/blog/2006/08/29/currying/" />
  <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
	
<p>I've been playing around with the <a href="http://en.wikipedia.org/wiki/ML_programming_language">ML language</a> recently, using the <a href="http://caml.inria.fr/">OCaml</a> implementation.</p>

<p>Picking up ML illustrates to me why it's useful to learn a number of different languages in order to experience various styles of programming - it's sometimes not enough that a language merely 'supports' a particular style; sometimes the language must <em>live</em> that style for the user to fully get it.</p>

<p>For example, lots of languages support '<a href="http://en.wikipedia.org/wiki/Currying">currying</a>' of functions by allowing the user to return anonymous closures. However ML is the first language I've used that embraces currying as the basis for implementing multi-argument functions - i.e. in ML, multi-argument functions are literally just nested single argument functions. </p>

<p>For example, in the following expression:</p>

<pre><code>
let sum = fun i j -> i + j
</code></pre>

<p>the type of 'sum' is:</p>

<pre><code>
int -> int -> int 
</code></pre>

<p>..meaning that 'sum' is a function that takes an integer and returns a function which takes an integer and returns an integer.</p>

<p>In addition OCaml's function-call syntax doesn't use brackets, which allows the call to be considered by the user as both as a multiple-arg function call or as a bunch of nested calls.
E.g. in </p>

<pre><code>
sum 3 4
</code></pre>

<p>the above could be read either as 'invoke the 'sum' function with the arguments 3 and 4', or alternatively as 'invoke the 'sum' function with an argument 3, and then invoke the result of that with the argument 4'.</p>

      </div>
  </content>
</entry>




</feed>
