<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Why are there no big applications written using functional languages?</title>
	<atom:link href="http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/</link>
	<description>The weblog of Tony Morris</description>
	<pubDate>Tue, 07 Feb 2012 18:39:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39759</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Sat, 17 Apr 2010 23:37:08 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39759</guid>
		<description>Array and Map are type constructors. Haskell (and Scala) allows you to be polymorphic on these values. It's also called higher-kinded polymorphism.</description>
		<content:encoded><![CDATA[<p>Array and Map are type constructors. Haskell (and Scala) allows you to be polymorphic on these values. It&#8217;s also called higher-kinded polymorphism.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christian Szegedy</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39732</link>
		<dc:creator>Christian Szegedy</dc:creator>
		<pubDate>Sat, 17 Apr 2010 07:58:46 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39732</guid>
		<description>What do you mean by "abstracting over type constructor"?</description>
		<content:encoded><![CDATA[<p>What do you mean by &#8220;abstracting over type constructor&#8221;?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39721</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Sat, 17 Apr 2010 01:38:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39721</guid>
		<description>Christian,
Haskell allows you to abstract on a type constructor, thereby not forcing you to necessarily fix on a specific implementation/complexity. OCaml does not allow this. I truly don't understand why using zippers might be "mind-bending" or "gymnastics" to solved directed-graph algorithms.</description>
		<content:encoded><![CDATA[<p>Christian,<br />
Haskell allows you to abstract on a type constructor, thereby not forcing you to necessarily fix on a specific implementation/complexity. OCaml does not allow this. I truly don&#8217;t understand why using zippers might be &#8220;mind-bending&#8221; or &#8220;gymnastics&#8221; to solved directed-graph algorithms.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christian Szegedy</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39718</link>
		<dc:creator>Christian Szegedy</dc:creator>
		<pubDate>Sat, 17 Apr 2010 01:04:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39718</guid>
		<description>I meant a much deeper issue than that.

There are different representation of functions: you can represent functions by arrays, maps, and b algorithmically, etc. When you specify your specific implementation e.g. in Haskell, then you fix a certain implementation, which will determine the complexity and ease of use of *updating* the specified data structures.

In the most common case you typically want to have some local functions to store some temporary data and then throw it away after your algorithm finished. This data is typically a function from some domain to a co-domain, but you will always need ad-hoc methods to represent your function as a data-structure, depending on the actual representation of the domain. Defining such temporary mappings can be quite tricky especially in a language like Haskell that does not support physical equality per/default. 

OTOH *allowing* physical equality (that you have basically for free e.g. in Scala) opens another Pandora box, with its own set of big problems.

These problems arise even in other non-pure functional languages like ocaml. Pure languages OTOH require additional mind-bending gymnastics to cope with circular data-structures like directed graphs in a computationally efficient manner: you either go the monad way (which is practically giving up, IMO) or start using zippers and all kinds of other "really clever" tricks...</description>
		<content:encoded><![CDATA[<p>I meant a much deeper issue than that.</p>
<p>There are different representation of functions: you can represent functions by arrays, maps, and b algorithmically, etc. When you specify your specific implementation e.g. in Haskell, then you fix a certain implementation, which will determine the complexity and ease of use of *updating* the specified data structures.</p>
<p>In the most common case you typically want to have some local functions to store some temporary data and then throw it away after your algorithm finished. This data is typically a function from some domain to a co-domain, but you will always need ad-hoc methods to represent your function as a data-structure, depending on the actual representation of the domain. Defining such temporary mappings can be quite tricky especially in a language like Haskell that does not support physical equality per/default. </p>
<p>OTOH *allowing* physical equality (that you have basically for free e.g. in Scala) opens another Pandora box, with its own set of big problems.</p>
<p>These problems arise even in other non-pure functional languages like ocaml. Pure languages OTOH require additional mind-bending gymnastics to cope with circular data-structures like directed graphs in a computationally efficient manner: you either go the monad way (which is practically giving up, IMO) or start using zippers and all kinds of other &#8220;really clever&#8221; tricks&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39607</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Wed, 14 Apr 2010 02:57:48 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39607</guid>
		<description>Christian,
In the language Haskell, given the data type:

&lt;pre lang="Haskell"&gt;
data Foo a = A Int &#124; B String &#124; C a
&lt;/pre&gt;

then A, B and C are regular functions. I don't know what else you might mean by "artificial lines." Languages like Scala certainly get this messed up (in more ways than one), but this is not by virtue of it being (or not being or somewhere in between) "functional."</description>
		<content:encoded><![CDATA[<p>Christian,<br />
In the language Haskell, given the data type:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell"><span style="color: #06c; font-weight: bold;">data</span> Foo a <span style="color: #339933; font-weight: bold;">=</span> A <span style="color: #cccc00; font-weight: bold;">Int</span> <span style="color: #339933; font-weight: bold;">|</span> B <span style="color: #cccc00; font-weight: bold;">String</span> <span style="color: #339933; font-weight: bold;">|</span> C a</pre></div></div>

<p>then A, B and C are regular functions. I don&#8217;t know what else you might mean by &#8220;artificial lines.&#8221; Languages like Scala certainly get this messed up (in more ways than one), but this is not by virtue of it being (or not being or somewhere in between) &#8220;functional.&#8221;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christian Szegedy</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39597</link>
		<dc:creator>Christian Szegedy</dc:creator>
		<pubDate>Tue, 13 Apr 2010 17:24:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39597</guid>
		<description>IMO, even so called functional programming languages make it harder than necessary to "manipulate" functions due to artificial lines drawn between data structures and functions.

However, the most fundamental problem with functions in algorithmic context is the question of identity, if we say "f: D-&#62; C" we implicitly assume that "equal" objects have equal function values. However, "identity" is a very elusive beast: it can mean different things based on the assumed equivalence relation and may be even computationally intractable.</description>
		<content:encoded><![CDATA[<p>IMO, even so called functional programming languages make it harder than necessary to &#8220;manipulate&#8221; functions due to artificial lines drawn between data structures and functions.</p>
<p>However, the most fundamental problem with functions in algorithmic context is the question of identity, if we say &#8220;f: D-&gt; C&#8221; we implicitly assume that &#8220;equal&#8221; objects have equal function values. However, &#8220;identity&#8221; is a very elusive beast: it can mean different things based on the assumed equivalence relation and may be even computationally intractable.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39377</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Wed, 07 Apr 2010 22:58:07 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39377</guid>
		<description>Hello Det,
Taken directly from FOLDOC, a function is:

&lt;blockquote&gt;
If D and C are sets (the domain and codomain) then a function f from D to C, normally written "f : D -&gt; C" is a subset of D x C such that:

1. For each d in D there exists some c in C such that (d,c) is an element of f. I.e. the function is defined for every element of D.

2. For each d in D, c1 and c2 in C, if both (d,c1) and (d,c2) are elements of f then c1 = c2. I.e. the function is uniquely defined for every element of D.
&lt;/blockquote&gt;

The answer to your second question can be found through experimentation. Functional Java and Scalaz are two such experiments.

I do not apologise for not answering arbitrary (and in this case, overwhelmingly uninteresting) questions and the entitlement is quite repulsive.</description>
		<content:encoded><![CDATA[<p>Hello Det,<br />
Taken directly from FOLDOC, a function is:</p>
<blockquote><p>
If D and C are sets (the domain and codomain) then a function f from D to C, normally written &#8220;f : D -> C&#8221; is a subset of D x C such that:</p>
<p>1. For each d in D there exists some c in C such that (d,c) is an element of f. I.e. the function is defined for every element of D.</p>
<p>2. For each d in D, c1 and c2 in C, if both (d,c1) and (d,c2) are elements of f then c1 = c2. I.e. the function is uniquely defined for every element of D.
</p></blockquote>
<p>The answer to your second question can be found through experimentation. Functional Java and Scalaz are two such experiments.</p>
<p>I do not apologise for not answering arbitrary (and in this case, overwhelmingly uninteresting) questions and the entitlement is quite repulsive.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Det</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39356</link>
		<dc:creator>Det</dc:creator>
		<pubDate>Wed, 07 Apr 2010 10:50:13 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39356</guid>
		<description>Interesting flow here ...

Well, I think if someone is not interested in fundamental or even philosophical debates, he's wrong here.  At least this is Tony's blog, and it is somehow his style.

The way he answered or not-answered here is in my eyes a kind of Zen experience. One must get into it, or it will not be fun but frustration. It is somehow a teaching play.

If you feel as if he did not understand you, ponder why.  If you do not understand him, meditate about the statements or responses. It scratches on your current paradigms.
If you're open to it, it could take you beyond a border.  At least that is how I felt about his and others comments on the Scala list some time ago.
So no reason to curse and moan. Play the game.

Tony, you wrote: "Trax2, a functional language in that context is one that does not make things difficult for the user to write functions."

So I suppose the open questions here are: 

- What are functions? 
(answer may be necessary for)
- What makes them difficult to write (in language X)?</description>
		<content:encoded><![CDATA[<p>Interesting flow here &#8230;</p>
<p>Well, I think if someone is not interested in fundamental or even philosophical debates, he&#8217;s wrong here.  At least this is Tony&#8217;s blog, and it is somehow his style.</p>
<p>The way he answered or not-answered here is in my eyes a kind of Zen experience. One must get into it, or it will not be fun but frustration. It is somehow a teaching play.</p>
<p>If you feel as if he did not understand you, ponder why.  If you do not understand him, meditate about the statements or responses. It scratches on your current paradigms.<br />
If you&#8217;re open to it, it could take you beyond a border.  At least that is how I felt about his and others comments on the Scala list some time ago.<br />
So no reason to curse and moan. Play the game.</p>
<p>Tony, you wrote: &#8220;Trax2, a functional language in that context is one that does not make things difficult for the user to write functions.&#8221;</p>
<p>So I suppose the open questions here are: </p>
<p>- What are functions?<br />
(answer may be necessary for)<br />
- What makes them difficult to write (in language X)?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39131</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Thu, 01 Apr 2010 04:02:36 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39131</guid>
		<description>mordaunt0,
Perhaps. In light of a misunderstanding between parties, the insults lessen the chance of progress. I resign pretty early on when this happens, but I also maintain a sense of optimism, perhaps to my own detriment, since there are cases of a turn-around. Thanks for the tips.</description>
		<content:encoded><![CDATA[<p>mordaunt0,<br />
Perhaps. In light of a misunderstanding between parties, the insults lessen the chance of progress. I resign pretty early on when this happens, but I also maintain a sense of optimism, perhaps to my own detriment, since there are cases of a turn-around. Thanks for the tips.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: mordaunt0</title>
		<link>http://blog.tmorris.net/why-are-there-no-big-applications-written-using-functional-languages/#comment-39128</link>
		<dc:creator>mordaunt0</dc:creator>
		<pubDate>Thu, 01 Apr 2010 01:10:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/?p=714#comment-39128</guid>
		<description>@tony morris

Well I thought a short answer to his question would have been a more productive use of time than the giant thread that was spawned by insisting on not wanting to answer it

But hey, it's your time :)</description>
		<content:encoded><![CDATA[<p>@tony morris</p>
<p>Well I thought a short answer to his question would have been a more productive use of time than the giant thread that was spawned by insisting on not wanting to answer it</p>
<p>But hey, it&#8217;s your time <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
</channel>
</rss>

