<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Daves Blog &#187; f#</title>
	<atom:link href="http://academicclub.org/blogs/dave/tag/f/feed/" rel="self" type="application/rss+xml" />
	<link>http://academicclub.org/blogs/dave</link>
	<description></description>
	<lastBuildDate>Mon, 05 Oct 2009 09:30:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A brief introduction to functional programming &#8211; pt.2: Data Immutability</title>
		<link>http://academicclub.org/blogs/dave/2009/07/09/a-brief-introduction-to-functional-programming-2-data-immutability/</link>
		<comments>http://academicclub.org/blogs/dave/2009/07/09/a-brief-introduction-to-functional-programming-2-data-immutability/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 12:00:38 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Computer Programming]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[data immutability]]></category>
		<category><![CDATA[f#]]></category>
		<category><![CDATA[lambda calculus]]></category>
		<category><![CDATA[side effects]]></category>

		<guid isPermaLink="false">http://academicclub.org/blogs/dave/2009/7/9/a-brief-introduction-to-functional-programming-2-data-immutability/</guid>
		<description><![CDATA[Let&#8217;s consider the following: 1. x = x +1 which is a typical imperative assignment; as programmers, we&#8217;ve kind of gotten used to such statements. But if shown to a mathematician, he would quickly and smugly look at it and &#8230; <a href="http://academicclub.org/blogs/dave/2009/07/09/a-brief-introduction-to-functional-programming-2-data-immutability/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2><span style="font-weight: normal;font-size: 13px">Let&#8217;s consider the following:</span></h2>
<p style="text-align: center"><em><strong><span style="font-style: normal">1</span></strong>. x = x +1</em></p>
<p>which is a typical <em>imperative</em> assignment; as programmers, we&#8217;ve kind of gotten used to such statements. But if shown to a mathematician, he would quickly and smugly look at it and then comment &#8220;<em>I don&#8217;t know any x  for which this is true</em>.&#8221; End of story.</p>
<p>Indeed, the <strong>1</strong> statement sums up what imperative programming is all about: with that instruction you&#8217;re incrementing the memory location of a 1 value. This obviously leads to <strong><em>mutable states</em></strong>, because the referenced object is a cell of memory whose content is sensitive to being modified to any value at any time by any method, and more generally, variables&#8217; values <em>change</em> over the time. Having mutable states allow methods to have <strong><em>side effects</em></strong>, which means that you can have a void method that doesn&#8217;t take any parameter, yet things happen behind the curtains when you call it. Hence, it matters, for instance, at which point of the program you call it, as well as how many times you call it, which thread you call it from and so forth.</p>
<p>In a pure functional programming language, instead, states are immutable. The paradigm behind functional programming says that everything can be solved creating and combining functions, which are intrinsically immutable (given the same input, they&#8217;ll return the same output, no matter when or how many times you invoke them). Functional programming is in many ways a <em>mathematically intuitive</em> programming style; in fact</p>
<p style="text-align: center"><strong>2</strong>. y = x +1</p>
<p style="text-align: center">
<p>is both a functional statement and a mathematical function. This is indeed the core concept of <em>functional</em> programming: values are results of function evaluations, rather than pure stored values.  As a consequence, there can&#8217;t be any side effect since there&#8217;s no variable data. This property is called <em>referential transparency</em>.</p>
<p>As already stated, it&#8217;s important to understand that this abstract concept is very easy to implement in a real situation; obviously, in a functional language such as F# a statement like</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt"><span style="color:#4f81bd">let</span> x = x + 1<br />
</span></p>
<p>is completely meaningless, because of what we just said. But also it&#8217;s important to understand that</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt"><span style="color:#4f81bd">let </span><strong>y</strong> = x + 1<br />
</span></p>
<p>would be meaningless without any <span style="font-family:Courier New">x</span> already declared with a value in the scope of the program. Hence, something like</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt"><span style="color:#4f81bd">let</span> x = 1<br />
</span></p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt"><span style="color:#4f81bd">let</span> y = x + 1<br />
</span></p>
<p>would evaluate y as 2, no matter when called.</p>
<p>It&#8217;s clear that an F# statement like</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt"><span style="color:#4f81bd">let</span> increment x = x + 1<br />
</span></p>
<p>is completely different from a C++ statement such as</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt">x = x + 1;<br />
</span></p>
<p>or even</p>
<p style="text-align: center"><span style="font-family:Courier New;font-size:10pt">x++;<br />
</span></p>
<p>but, instead, much more similar to</p>
<p style="text-align: center"><span style="font-family:Consolas;font-size:10pt"><span style="color:blue">int</span> increment (<span style="color:blue">int</span> arg){<br />
</span></p>
<p style="margin-left: 144pt"><span style="font-family:Consolas;font-size:10pt"><span style="color:blue"> return</span> arg++;<br />
</span></p>
<p style="margin-left: 144pt"><span style="font-size:10pt"><span style="font-family:Consolas"> }</span><span style="color:#4f81bd;font-family:Courier New"><br />
</span></span></p>
<p>which is, indeed, a function (for simplicity I am assuming here that the type is <span style="font-family:Courier New">int</span>). Indeed, the keyword <span style="color:#1f497d;font-family:Courier New">let</span> in F# is not an equivalent of <span style="color:#1f497d;font-family:Courier New">dim</span> in Visual Basic or <span style="color:#1f497d;font-family:Courier New">var</span> in Pascal, which are strictly procedural languages. It doesn&#8217;t mean &#8220;<em>assign to the memory address pointed by the reference on the left the value on the right</em>,&#8221; but rather &#8220;<em>create a function that evaluates the expression on the right by substituting the given arguments and then return the value.</em>&#8221;</p>
<p>At this point it&#8217;s nice to note how everything comes down to λ-expressions once again. In fact, the previous function can easily be expressed through a trivial λ as follows:</p>
<p style="text-align: center"><span style="font-family:Times New Roman"><em><strong>3</strong></em><em>. λx.+ x 1</em></span></p>
<p>More extensively, we can see how it&#8217;s possible to adopt a functional programming style in a typical C# class such as the following.</p>
<p style="text-align: center"><img src="http://academicclub.org/blogs/dave/files/2009/07/070309-2011-abriefintro5.png" alt="" /></p>
<p style="text-align: justify">Problems here arise in two points: the public variables x and y are fully accessible and editable from outside the object, and the <span style="font-family:Courier New">void</span> method <span style="font-family:Courier New">move</span> operates through side-effects on the x and y variables. A simple way to turn that class into a functional class is by marking <span style="font-family:Courier New">readonly </span>the x and y fields, and, more importantly, by editing the <span style="font-family:Courier New">move</span> function as follows:</p>
<p style="text-align: center"><img src="http://academicclub.org/blogs/dave/files/2009/07/070309-2011-abriefintro6.png" alt="" /></p>
<p>Every time we move the point, a new <span style="font-family:Courier New">Point</span> object is created and returned, and once it&#8217;s been created, it&#8217;s immutable. This is, essentially, a trivial application of a functional programming style in an imperative object-oriented language such as C#.</p>
]]></content:encoded>
			<wfw:commentRss>http://academicclub.org/blogs/dave/2009/07/09/a-brief-introduction-to-functional-programming-2-data-immutability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A brief introduction to Functional Programming &#8211; pt. 1</title>
		<link>http://academicclub.org/blogs/dave/2009/07/03/30/</link>
		<comments>http://academicclub.org/blogs/dave/2009/07/03/30/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 02:44:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Computer Programming]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[f#]]></category>
		<category><![CDATA[imperative programming]]></category>
		<category><![CDATA[lambda calculus]]></category>
		<category><![CDATA[object orientation]]></category>
		<category><![CDATA[programming paradigms]]></category>

		<guid isPermaLink="false">http://academicclub.org/blogs/dave/2009/7/3/30/</guid>
		<description><![CDATA[Overview: programming paradigms If you are not totally inexperienced about computer programming, in which case reading this article would just plainly be a total loss of time, you certainly know that there are a lot of different programming languages that &#8230; <a href="http://academicclub.org/blogs/dave/2009/07/03/30/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div>
<p><span style="text-decoration: underline"><strong>Overview: programming paradigms<br />
</strong></span></p>
<p>If you are not totally inexperienced about computer programming, in which case reading this article would just plainly be a total loss of time, you certainly know that there are a lot of different programming languages that have been developed in different periods to supply different needs; each one of them carries a different view about the semantic world they cover. There is, indeed, an entire branch of computer science that studies<em>programming paradigms</em>, as are these &#8220;views&#8221; called.</p>
<p>We don&#8217;t really need to review the story of computer programming back to hard wiring in this article, but a brief synopsis is needed in order to make things a bit clearer. So, after someone realized that wiring physically the programs wasn&#8217;t just going to work, computers started being programmed using binary code that represented control sequences fed to the computer CPU. That probably made programmers sweat a bit less, but still it was as comfortable as being stabbed. Shortly after, in the early 50s, assembly languages were invented in an attempt to make computer programming easier.</p>
<p>At the time symbolic labels and mnemonic keywords probably seemed like heaven, but still writing assembly is not exactly the most comfortable thing you can think of. It&#8217;s somehow like working in the sewers: you know that it&#8217;s an important work, and that someone&#8217;s to do it, but you really don&#8217;t want to know anything more, no matter how many documentaries Discovery Channel makes on it. Coping with the dirty secrets of complexness is not for everybody.</p>
<p>Indeed, it didn&#8217;t take much longer again before somebody else got tired of assembly&#8217;s complexity and tried to abstract it into what is known as <em>imperative programming</em>: a series of statements that express, step by step, exactly the procedure that should be followed to solve a problem. I don&#8217;t really want to dig into the issue, but procedural programming (as is it&#8217;s also called, with a particular reference to those languages capable of organizing groups of operations into blocks called &#8220;functions&#8221;) carried an immense number of mathematical and logical issues, some of which are really worth a read (i.e. Dijkstra&#8217;s <a href="http://portal.acm.org/citation.cfm?doid=362929.362947">GOTO statement</a> article, compilation-related automaton theory, design patterns, data representing, ecc), and it&#8217;s still the mainly used programming technique.</p>
<p>Yes, because the next-step, <em>id est</em> Object-Oriented programming, is still procedural. By OO programming we mean languages where data, and methods that can manipulate the data, are packed together into single units called &#8220;objects&#8221; that represent a coherent and transparent set of information; in fact, external user can access the data is via the object&#8217;s &#8220;methods&#8221;, which are nothing else than well-fitted procedures. The revolution carried by OO programming doesn&#8217;t lie on a brand new programming paradigm itself, but rather on how programs are structured thanks this sort of overlay. In fact object-orientation is implementable, in different degrees, on every typed language. There are indeed masochistic implementations of assembly-OO-languages (HLA) as well as functional OO languages (Needle), pure OO languages (Ruby) ecc.</p>
<p>OO programming is an elegant way of expressing a program as an algebra. We define objects (classes) as a hierarchy of structured containers of data plus the operations available on the structured container. This way of defining programs allows for a much cleaner level of abstraction, since we do not manipulate data with &#8220;random&#8221; chunks of code (procedures) but the data only allows structured accesses to itself through its operators, which in turn become part of the data themselves. [<em>GM</em>]</p>
<p>After OO-programming, another little step toward another layer of abstraction has been given by code managing, which means that the program is executed under the management of a virtual machine, instead that directly on the computer&#8217;s CPU; wrapping the executable into a sandbox enhances its safety and security and allows the creation of monsters like <em>garbage collectors</em>, but usually at a price of a noticeable overhead (JIT compiling, intermediate languages and similia have been invented to increase efficiency of interpreted languages). It&#8217;s important to observe, though, that theoretically every language could be interpreted (executed into a sandbox) or compiled (and then executed directly on the CPU).</p>
<p>Managed code allows to define safer constructs, for example forbidding (let the Lord of Heaven be praised) pointer arithmetic (cit. Djikstra). By providing some restrictions on managed code, we can achieve compilers that guarantee very strong statically validated properties (see Singularity compiler) and very high level runtime primitives ranging from lambdas to reflection to quotations. [<em>GM</em>]</p>
<p>On the other side of the barricade (which means universities), another paradigm was being developed in the meantime: declarative programming. For a long time this has been considered just an academic exercise, but later it has gained popularity among specialist. A program written in a declarative language will express the logic of a computation without describing its control flow, focusing on (indeed) <em>declaring</em> what the program should accomplish, rather than describing how to go about accomplishing it.</p>
<p><span style="text-decoration: underline"><strong>Different needs</strong></span></p>
<p>The relationship between languages and expressiveness is hence summarized in the following picture.</p>
<p><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro110.png" alt="" /></p>
<p>Where imperative languages allow the programmer to have a deeper control of what the machine&#8217;s actually doing, the declarative approach simplifies a lot the task of programming: we&#8217;ll see in the next paragraphs how this abstraction is obtained, what it&#8217;s useful for and which needs may supply.</p>
<p>What should be clear at this stage is that there&#8217;s no such thing as a &#8220;better language&#8221; as a general statement. There are more suitable languages for different purposes: nobody would enjoy writing a parser in assembly just as nobody would write a kernel in F# without being a total sandwich short of a picnic, but both things are possible.</p>
<p><span style="text-decoration: underline"><strong>Trends<br />
</strong></span></p>
<p>As suggested by Anders Hejlsberg recently, there are three trends that broadly impact on computer programming today. The first is the tendency toward forms of more <strong>declarative</strong> programming, which is made clear by the wide diffusion of Domain Specific Languages, which are languages targeted to a specific context (XAML, XSLT, HTML, SQL, CSS, Makefiles and so forth). There&#8217;s a huge debate around what is and what isn&#8217;t a DSL, but here we&#8217;ll just observe that they play a relevant role in today&#8217;s programming scene.</p>
<p><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro31.png" alt="" /></p>
<p>Second comes the need for <strong>dynamic</strong> languages. According to Wikipedia, such languages are &#8220;<em>high-level programming languages that execute at runtime many common behaviors that other languages might perform during compilation, if at all. These behaviors could include extension of the program, by adding new code, by extending objects and definitions, or by modifying the type system, all during program execution. These behaviors can be emulated in nearly any language of sufficient complexity, but dynamic languages provide direct tools to make use of them.</em>&#8221;</p>
<p>Last and definitely not least, is the need for more <strong>concurrency</strong>. As you may know, nowadays Moore&#8217;s law doesn&#8217;t apply to CPUs frequency any longer, but it rather does to the number of cores that processors have. This is an actual revolution the market is pushing, which is throwing into crisis the instruments that have been developed after more than half a century of time-sharing mono-processor multitasked programming. Anyone who has ever had the misfortune of coping with Java&#8217;s threading model, for instance, knows how complex is to develop multithreaded applications that perform real concurrency. There are countless problems due to shared memory locations and resources, side-effects, (dead)locks, and so on. Thanks to memory sharing issues, it&#8217;s impossible to parallelize efficiently different operations if they share variables or resources, because the broad and unavoidable use of <em>mutexes</em> would make them wait for each other exactly as it would happen in a sequential execution. Such solutions don&#8217;t really sound like viable possibilities in a market where CPUs with hundreds of cores are foreseen to be developed within the next five years.</p>
<p><span style="text-decoration: underline"><strong>Functional Programming and λ-calculus</strong></span></p>
<p>So, straight to the core of this article, functional programming is possibly an answer to all the needs that computer programming is asking for today. FP is a particular kind of declarative programming where the program consists entirely of functions, in a mathematical sense. Hence, functional programs do not contain any assignment statement, since there aren&#8217;t variables and therefore, no side-effects (Although very few modern FP languages don&#8217;t allow for side-effects. Haskell is a notable exception, confining side-effects only to the restricted scope of <em>monads</em>. Languages like OCaML or F# allow wide use of mutability while making everything immutable by default. [<em>GM</em>]). So since expressions denote one single value, they can be dynamically evaluated at any time, freeing the programmer from the burden of prescribing one particular control flow; functional programs are hence said to be <em>referentially transparent</em>. We&#8217;ll see how all of this is possible further on this series of articles.</p>
<p>The theoretical framework in which FP can be put into is Lambda calculus, a formal <span style="color:black">system devised in the 30s by Alonzo Church to investigate functions, function application and recursion. It&#8217;s basically a very general programming language itself, made of a single transformation rule (variable substitution) and a single function definition schema. In spite of this simplicity, it does formalize every possible computable function.<br />
</span></p>
<p>Objects of study in Lambda calculus are λ-terms, which are anonymous functions that perform an expressed transformation to their arguments. A basic λ-term is this:</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro41.png" alt="" /><span style="font-family:Times New Roman"><em><br />
</em></span></p>
<p>which represent an identity function. The following expression is a simple λ-term that expresses a function (λ) that takes <span style="font-family:Times New Roman"><em>x</em></span> as a argument an returns its double (<span style="font-family:Times New Roman"><em>2x</em></span>).</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro51.png" alt="" /><span style="font-family:Times New Roman"><em><br />
</em></span></p>
<p style="margin-left: 36pt">Obviously functions can be nested, like this:</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro61.png" alt="" /><span style="font-family:Times New Roman"><em><br />
</em></span></p>
<p>That is the function of x that returns the function of y that returns the product of the sum of x and y and 2. Since all λ expressions have only one argument, they can be cascaded like in <strong>3</strong>. Such a practice is called <em>currying</em>, not because it&#8217;s spicy, but because it&#8217;s named after Haskell Curry, whom we&#8217;ll meet again soon.</p>
<p>Evaluating λ-expressions is a simple task that reminds formal grammars sentence derivation:</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro71.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro81.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro91.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro101.png" alt="" /></p>
<p>When lambdas come in, the situation gets a little bit more interesting. (The parenthesis is used to &#8220;call&#8221; a function; when a λ-term is inserted into parenthesis that means that it&#8217;s to be evaluated).</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro111.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro121.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro131.png" alt="" /></p>
<p>The substitution we operated between <strong>8</strong> and <strong>9</strong> on the formal parameter is so called β-reduction, which is a particularly important operation (along with α- and η-conversion), because the meaning of lambda expressions is defined by how expressions can be reduced. It&#8217;s possible to apply recursively λ also to other expressions, as follows:</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro141.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro151.png" alt="" /></p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro161.png" alt="" /></p>
<p>In an expression, each appearance of a variable is either bound or free, depending on whether such variable is an argument of λ or not. β-reduction of</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro171.png" alt="" /></p>
<p>Replaces every x that occurs free in E with y, where E is another well-formed λ-expression. In general, to make λ-terms less confusing, we can use the α-conversion, which is nothing more than a rule that allows us to rename parameters and that we implicitly used also in <strong>3</strong>.</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro181.png" alt="" /></p>
<p>It comes quite natural to evaluate λ-terms using the same application order that we are used to normalize polynomials with, but there are actually several issues related to the order that can be chosen to reduce an expression. Basically there are two possibilities: always reduce the leftmost innermost redex (which is a sub-expression that can be reduced), or always reduce first the leftmost outmost redex. These two approaches are respectively called <strong>applicative</strong> and <strong>normative</strong> reduction. The former is usually more efficient, the latter accepts a larger class of programs. What matters here is that progressive reduction should lead to what it&#8217;s known as a <strong>normal form</strong>, that is a λ-expression that cannot be reduced any further. Thus,</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro191.png" alt="" /><strong><br />
</strong></p>
<p>Is the normal form of</p>
<p style="text-align: center"><img src="http://ianaaron.eu/wp-content/uploads/2009/06/062609-1750-abriefintro201.png" alt="" /></p>
<p>Like human relationships, not every λ-expression has a normal form. Trying to reduce a non-reducible expression to a normal form will only lead to the same form again and again in an infinite loop. There is, anyway, no algorithm which takes as input two λ-expressions and outputs TRUE or FALSE depending on whether or not the two expressions are equivalent. This was historically the first problem for which <em>undecidability</em> could be proven. (There is a strong relationship between Russel&#8217;s Paradox and untyped λ-terms where something is applied to itself. [GM])</p>
<p>What is probably the most important result in λ-calculus, is the Church–Rosser theorem, which states that if there are two distinct reductions starting from the same lambda calculus term, then there exists a term that is reachable via a sequence of reductions from both redex. In other words, if there&#8217;s a normal form, there&#8217;s a strategy to find it and the result is unique; in formal terms, CR theorem is a proof of <em>confluence</em>. At a higher level, it means that evaluation (β-reduction) can be carried out in any order, even in <strong>parallel</strong>.</p>
<p>It&#8217;s important to notice that functional programming is not language-specific, because it&#8217;s a general theory (and functional programming is λ-calculus with a more palatable syntax). For instance, C++ or Java can be programmed in a functional way (an article about this will follow), although there are languages specifically designed for the task. What matters is that, on a more formal side, it&#8217;s been proven the isomorphism between Turing Machines and λ-calculus.</p>
<p>Λ-calculus give us a solid mathematical foundation, basing on which it&#8217;s possible to comprehend that functional programming is no more an academic exercise, but rather it&#8217;s the next natural step in computer programming.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>[<em>GM</em>] notes by <a href="http://blogs.academicclub.org/xna-eng/" target="_blank">Giuseppe Maggiore</a></div>
]]></content:encoded>
			<wfw:commentRss>http://academicclub.org/blogs/dave/2009/07/03/30/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
