<?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>andreas-schlapsi.at &#187; Funktionale Programmierung</title>
	<atom:link href="http://www.andreas-schlapsi.at/tag/funktionale-programmierung/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andreas-schlapsi.at</link>
	<description>Software-Entwicklung, .NET &#38; Co.</description>
	<lastBuildDate>Sat, 17 Sep 2011 16:28:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Treffen der .NET Open Space Austria: F# und funktionale Programmierung</title>
		<link>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/</link>
		<comments>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 21:48:25 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Funktionale Programmierung]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1121</guid>
		<description><![CDATA[Am 7. Dezember findet wieder ein Treffen der .NET Open Space Austria User Group statt. Dieses Mal bereite ich etwas über das Thema F# und funktionale Programmierung vor. Das Treffen findet bei Microsoft Österreich GmbH statt. Details gibt es wie immer auf der NING-Seite der Gruppe und auf der Codefest-Seite.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.andreas-schlapsi.at/wp-content/uploads/2010/12/LAMBDA_capital_and_small.png"><img src="http://www.andreas-schlapsi.at/wp-content/uploads/2010/12/LAMBDA_capital_and_small-150x150.png" alt="" title="LAMBDA_(capital_and_small)" width="150" height="150" class="alignleft size-thumbnail wp-image-1124" /></a>Am 7. Dezember findet wieder ein Treffen der .NET Open Space Austria User Group statt. Dieses Mal bereite ich etwas über das Thema F# und funktionale Programmierung vor.</p>
<p>Das Treffen findet bei Microsoft Österreich GmbH statt.</p>
<p>Details gibt es wie immer auf der <a href="http://dotnetopenspace.ning.com/forum/topics/07122010-dotnet">NING-Seite der Gruppe</a> und auf der <a href="http://www.codefest.at/post/2010/11/26/07122010-Wien-F-und-funktionale-Programmierung-in-C-Treffen-der-NET-Open-Space-Austria.aspx">Codefest-Seite</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funktionen höherer Ordnung</title>
		<link>http://www.andreas-schlapsi.at/2009/11/29/funktionen-hoherer-ordnung/</link>
		<comments>http://www.andreas-schlapsi.at/2009/11/29/funktionen-hoherer-ordnung/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 18:41:57 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Funktionale Programmierung]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=667</guid>
		<description><![CDATA[Funktionale Programmierung ist ein Programmierparadigma, das Datenverarbeitung als Auswertung mathematischer Funktionen behandelt. Der Gegensatz dazu ist imperative Programmierung, die den Schwerpunkt auf Zustandsänderungen legt und die den derzeit am häufigsten verwendeten Programmiersprachen zugrunde liegt. In funktionalen Programmiersprachen sind Funktionen ein wichtiges Konzept. Die Strukturierung des Programmcodes erfolgt mit Hilfe von Funktionen. Deshalb werde ich hier [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Funktionale Programmierung in der Wikipedia" href="http://de.wikipedia.org/wiki/Funktionale_Programmierung">Funktionale Programmierung</a> ist ein Programmierparadigma, das Datenverarbeitung als Auswertung mathematischer Funktionen behandelt. Der Gegensatz dazu ist imperative Programmierung, die den Schwerpunkt auf Zustandsänderungen legt und die den derzeit am häufigsten verwendeten Programmiersprachen zugrunde liegt.<br />
<span id="more-667"></span><br />
In funktionalen Programmiersprachen sind Funktionen ein wichtiges Konzept. Die Strukturierung des Programmcodes erfolgt mit Hilfe von Funktionen. Deshalb werde ich hier eine Reihe von Artikel veröffentlichen, die sich mit Funktionen in funktionalen Programmierspachen beschäftigen.</p>
<h2>Funktionen höherer Ordnung</h2>
<p>In funktionalen Programmiersprachen können Funktionen als Parameter an andere Funktionen übergeben oder als Rückgabewert verwendet werden. Solche Funktionen nennt man <a href="http://de.wikipedia.org/wiki/Funktion_h%C3%B6herer_Ordnung" title="Funktion höherer Ordnung in der Wikipedia">Funktionen höherer Ordnung</a>.</p>
<p>Delegates ermöglichen es, dass man auch in C# Funktionen höherer Ordnung entwickeln kann. In der .NET-Klassenbibliothek finden sich einige Beispiele dafür, z.B. hat die Klasse <code>System.Collections.Generic.List&amp;lt;T&amp;gt;</code> eine Methode <code>Sort</code>, die als einzigen Parameter einen Delegate erwartet, der den Vergleich durchführen soll. Auch in LINQ gibt es einige Extension-Methods, die Delegates als Parameter bekommen.</p>
<h2>Map, Filter und Fold</h2>
<p>In funktionalen Programmiersprachen werden die drei Funktionen <code>map</code>, <code>filter</code> und <code>fold</code> häufig verwendet, um mit Listen und ähnlichen Datenstrukturen zu arbeiten. Alle drei Funktionen erwarten neben einer Liste eine Funktion als Parameter. Damit handelt es sich um Funktionen höherer Ordnung.</p>
<h3>Map</h3>
<p><a title="Map in Wikipedia" href="http://en.wikipedia.org/wiki/Map_%28higher-order_function%29">Map</a> wendet die angegebene Funktion auf jedes Element der Liste an und gibt eine Liste der Ergebnisse zurück. LINQ kennt die Extension-Method <code>Select</code>, die <code>IEnumerable&amp;lt;T&amp;gt;</code> erweitert und etwas Ähnliches macht:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#91;</span>code<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span>czo4OTpcInZhciBudW1iZXJzID0gbmV3W10geyAxLCAyLCAzLCA0LCA1IH07DQp2YXIgZG91YmxlZE51bWJlcnMgPSBudW1iZXJzLlN7WyYqJl19ZWxlY3QgKHggPT4geCAqIHgpO1wiO3tbJiomXX0<span style="color: #008000;">=</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">/</span>code<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span></pre></div></div>

<p>In F# sieht das so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">let</span> numbers <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">&#91;</span><span style="color: #c6c;">1</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">5</span><span style="color: #a52a2a;">&#93;</span>
<span style="color: #06c; font-weight: bold;">let</span> doubledNumbers <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">List</span><span style="color: #a52a2a;">.</span>map <span style="color: #a52a2a;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> x <span style="color: #a52a2a;">*</span> x<span style="color: #a52a2a;">&#41;</span> numbers</pre></div></div>

<p><code>let</code> ist das wichtigste Schlüsselwort für das Programmieren in F#. Es wird verwendet, um Daten, berechnete Werte, Funktionen und Prozeduren zu definieren. Links steht üblicherweise der Bezeichner. Nach dem Gleichheitszeichen folgt ein Ausdruck.</p>
<p>Die Zeile <code>let numbers = [1; 2; 3; 4; 5]</code> weist dem Namen &#8220;numbers&#8221; die Liste [1; 2; 3; 4; 5] als Wert zu. In F# wird eine Liste in eckigen Klammern eingeschlossen und die einzelnen Listenelemente werden durch einen Strichpunkt (Semikolon) getrennt.</p>
<p>Die zweite Zeile ruft die Funktion <code>map</code> des Moduls <code>List</code> auf. Man sieht, dass es nicht notwendig ist, die Parameter in Klammern anzugeben. Der erste Parameter ist die Funktion, die auf jedes Listenelement angewandt werden soll. In unserem Beispiel ist das die anonyme Methode <code>fun&amp;nbsp;x&amp;nbsp;-&amp;gt;&amp;nbsp;x&amp;nbsp;*&amp;nbsp;x</code>. In F# wird eine anonyme Methode mit dem Schlüsselwort <code>fun</code> deklariert. Danach folgen die Funktionsargumente und nach dem Pfeil folgt der Funktionskörper. Der zweite Parameter ist die Liste &#8220;numbers&#8221;. Das Ergebnis wird an den Namen &#8220;doubledNumbers&#8221; gebunden.</p>
<h3>Filter</h3>
<p>Mit <a title="Filter in Wikipedia" href="http://en.wikipedia.org/wiki/Filter_%28higher-order_function%29">filter</a> lässt sich eine Liste nach einem bestimmten Kriterium filtern. Das Kriterium wird als Funktion angegeben, die true für alle Elemente zurückgeben soll, die in die Ergebnisliste aufgenommen werden sollen. Das Äquivalent in LINQ heißt <code>Where</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var numbers <span style="color: #008000;">=</span> <span style="color: #008000;">new</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">2</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">5</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
var evenNumbers <span style="color: #008000;">=</span> numbers<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span> <span style="color: #008000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">&#40;</span>x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Hier wieder das Beispiel in F#:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">let</span> numbers <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">&#91;</span><span style="color: #c6c;">1</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">5</span><span style="color: #a52a2a;">&#93;</span>
<span style="color: #06c; font-weight: bold;">let</span> evenNumbers <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">List</span><span style="color: #a52a2a;">.</span>filter <span style="color: #a52a2a;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #a52a2a;">&#40;</span>x <span style="color: #a52a2a;">%</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><span style="color: #a52a2a;">&#41;</span> numbers</pre></div></div>

<p>An diesem Beispiel sieht man, dass Lambda-Ausdrücke und anonyme Methoden nicht immer besser lesbar sind. Um die Lesbarkeit zu erhöhen, können wir die obigen Beispiele umschreiben:</p>
<p>In C#:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">bool</span> IsEven <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">&#40;</span>x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
var numbers <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">2</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">5</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
var evenNumbers <span style="color: #008000;">=</span> numbers<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span> <span style="color: #008000;">&#40;</span>IsEven<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Und in F#:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">let</span> IsEven x <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">&#40;</span>x <span style="color: #a52a2a;">%</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span>
<span style="color: #06c; font-weight: bold;">let</span> numbers <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">&#91;</span><span style="color: #c6c;">1</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">5</span><span style="color: #a52a2a;">&#93;</span>
<span style="color: #06c; font-weight: bold;">let</span> evenNumbers <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">List</span><span style="color: #a52a2a;">.</span>filter IsEven numbers</pre></div></div>

<p>Die erste Zeile definiert die Funktion <code>IsEven</code>, die einen Parameter <code>x</code> akzeptiert. Nach dem ersten Gleichheitszeichen folgt der Funktionskörper: <code>(x&amp;nbsp;%&amp;nbsp;2)&amp;nbsp;=&amp;nbsp;0</code>. Dieser Ausdruck berechnet den Rest der Division von x durch 2 und vergleicht ihn mit 0. Sowohl beim <code>let</code>-Binding als auch beim Vergleich wird in F# ein einzelnes Gleichheitszeichen verwendet.</p>
<h3>Fold</h3>
<p><a title="Fold in Wikipedia" href="http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29">Fold</a> berechnet einen akkumulierten Wert über alle Elemente einer Liste. Die Funktion gibt an, wie ein neuer akkumulierter Wert aus dem alten Wert und einem Listenelement ermittelt wird. Das LINQ-Äquivalent ist Aggregate.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var numbers <span style="color: #008000;">=</span> <span style="color: #008000;">new</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">2</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">5</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
var sum <span style="color: #008000;">=</span> numbers<span style="color: #008000;">.</span><span style="color: #0000FF;">Aggregate</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, <span style="color: #008000;">&#40;</span>s, x<span style="color: #008000;">&#41;</span> <span style="color: #008000;">=&gt;</span> s <span style="color: #008000;">+</span> x<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Dieses Beispiel berechnet die Summe der Zahlen im Array. Um besser zu verstehen, wie Fold funktioniert, hier die Einzelschritte:</p>
<p>Bei Aufruf: s = 0, Liste: <strong>1</strong>, 2, 3, 4, 5</p>
<p>1. s = 0 + <strong>1</strong>, Liste: <strong>2</strong>, 3, 4, 5</p>
<p>2. s = (0 + 1) + <strong>2</strong>, Liste: <strong>3</strong>, 4, 5</p>
<p>3. s = ((0 + 1) + 2) + <strong>3</strong>, Liste: <strong>4</strong>, 5</p>
<p>4. s = (((0 + 1) + 2) + 3) + <strong>4</strong> = 10, Liste: <strong>5</strong></p>
<p>5. s = ((((0 + 1) + 2) + 3) + 4) + <strong>5</strong> = 15, Liste: -</p>
<p>Die Variable sum im obigen Beispiel hat also den Wert ((((0 + 1) + 2) + 3) + 4) + 5<strong> = </strong>15.</p>
<p>Hier in F#:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">let</span> numbers <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">&#91;</span><span style="color: #c6c;">1</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">5</span><span style="color: #a52a2a;">&#93;</span>
<span style="color: #06c; font-weight: bold;">let</span> sum <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">List</span><span style="color: #a52a2a;">.</span>fold <span style="color: #a52a2a;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> s x <span style="color: #a52a2a;">-&gt;</span> s <span style="color: #a52a2a;">+</span> x<span style="color: #a52a2a;">&#41;</span> <span style="color: #c6c;">0</span> numbers</pre></div></div>

<p>Es gibt in F# die Möglichkeit, den Operator + als Funktion anzugeben. Statt 4 + 9 kann man also (+) 4 9 schreiben. Damit kann im obigen Beispiel die letzte Zeile so geschrieben werden:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">let</span> sum <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">List</span><span style="color: #a52a2a;">.</span>fold <span style="color: #a52a2a;">&#40;</span><span style="color: #a52a2a;">+</span><span style="color: #a52a2a;">&#41;</span> <span style="color: #c6c;">0</span> numbers</pre></div></div>

<p>Es gibt zwei verschiedene Arten von Folds: <a title="Fun with Folds" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/02/14/fun-with-folds.aspx">left Fold und right Fold</a>. In früheren F#-Versionen gab es die zwei Funktionen List.fold_left und List.fold_right. Diese wurden jedoch umbenannt und heißen jetzt fold (left fold) und foldBack (right fold). LINQs Aggregate-Funktion arbeitet wie ein left Fold.</p>
<h2>Fazit</h2>
<p>Funktionen höherer Ordnung sind ein wichtiges Mittel in der funktionalen Programmierung für die Wiederverwendung von Code. Gemeinsam mit anderen Konzepten ermöglichen sie den deklarativen Stil der funktionalen Programmierung.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2009/11/29/funktionen-hoherer-ordnung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was ist funktionale Programmierung?</title>
		<link>http://www.andreas-schlapsi.at/2009/04/14/was-ist-funktionale-programmierung/</link>
		<comments>http://www.andreas-schlapsi.at/2009/04/14/was-ist-funktionale-programmierung/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 23:25:58 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Funktionale Programmierung]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=298</guid>
		<description><![CDATA[In diesem Jahr beschäftige ich mich mit funktionaler Programmierung. Daher werde ich in den nächsten Monaten vermehrt Blogposts über dieses Thema schreiben. Dieses Mal geht es darum, was funktionale Programmierung eigentlich ist und worin es sich vom Programmierparadigma der „Mainstream“-Programmiersprachen wie C#, Java, C/C++ oder VB unterscheidet. Unveränderliche Variablen Prozedurale und objekt-orientierte Programmiersprachen folgen dem [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Jahr beschäftige ich mich mit funktionaler Programmierung. Daher werde ich in den nächsten Monaten vermehrt Blogposts über dieses Thema schreiben. Dieses Mal geht es darum, was funktionale Programmierung eigentlich ist und worin es sich vom Programmierparadigma der „Mainstream“-Programmiersprachen wie C#, Java, C/C++ oder VB unterscheidet.<br />
<span id="more-298"></span></p>
<h2>Unveränderliche Variablen</h2>
<p>Prozedurale und objekt-orientierte Programmiersprachen folgen dem <a title="Imperative Programmierung" href="http://de.wikipedia.org/wiki/Imperative_Programmierung">imperativen Programmierparadigma</a>, das sich stark an der <a title="Von-Neumann-Architektur" href="http://de.wikipedia.org/wiki/Von-Neumann-Architektur">Von-Neumann-Architektur</a> orientiert. Wenn das Programm ausgeführt wird, arbeitet ein Rechner die Befehle des Programms nacheinander ab. Variablen repräsentieren einen bestimmten Zustand, der sich während der Programmausführung ändern kann.</p>
<p>In funktionalen Sprachen sind Variablen unveränderlich. Wenn ihnen einmal ein Wert zugewiesen wurde, kann dieser nicht mehr verändert werden. Variablen sind also Namen für bestimmte Werte, während in imperativen Sprachen Variablen Namen für Speicherbereiche sind, die veränderliche Informationen beinhalten.</p>
<p>Unveränderliche Variablen bieten einen Vorteil bei Multithreading: Mehrere Threads teilen sich nicht den gleichen Speicherbereich, weshalb der Code für parallel verarbeitete Programme  einfacher wird.</p>
<h2>Keine Nebenwirkungen</h2>
<p>Im Gegensatz zu imperativen Programmiersprachen ist es bei der funktionalen Programmierung üblich, dass Funktionen keine Nebenwirkungen (engl. side effect) haben. Die Typsysteme mancher funktionalen Programmiersprachen wie z.B. <a title="Haskell" href="http://www.haskell.org">Haskell</a> stellen sicher, dass Funktionen keine Nebenwirkungen aufweisen. Nebenwirkungsfreie Funktionen sind leichter testbar, weil sich der Rückgabewert nur aus den Eingabeparametern ergibt.</p>
<h2>Bestimmte Domänen</h2>
<p>Funktionale Programmiersprachen bieten bei bestimmten Anwendungsfällen wie mathematische Domänen ein einfacheres Programmiermodell. <a href="http://www.janestreet.com">Jane Street</a>, eine Firma aus New York, die Software für die Wallstreet entwickelt, verwendet <a title="OCaml" href="http://caml.inria.fr/ocaml/">OCaml</a>, weil sich diese funktionale Programmiersprache am besten für solche Anwendungen eignet.</p>
<h2>Funktionale und objekt-orientierte Programmierung</h2>
<p>Programmiersprachen wie <a title="Scala" href="http://www.scala-lang.org/">Scala</a>, OCaml oder <a title="F#" href="http://msdn.microsoft.com/de-de/fsharp/default(en-us).aspx">F#</a> folgen mehreren Paradigmen, wobei das funktionale Programmierparadigma im Vordergrund steht. Doch all diese Programmiersprachen sind auch objektorientiert, d.h. es können funktionale und objektorientierte Programmierparadigmen gemischt werden. Scala, eine Programmiersprache für die <a title="Java Virtual Machine" href="http://de.wikipedia.org/wiki/Java_Virtual_Machine">JVM</a>, und F#, das .NET-Pendant, haben den Vorteil, dass sie auf bestehenden Code zugreifen können und nicht alles neu geschrieben werden muss.</p>
<p>Für viele <a title="Entwurfsmuster" href="http://de.wikipedia.org/wiki/Entwurfsmuster">Entwurfsmuster</a>, die in der objektorientierten Programmierung verwendet werden, gibt es in der funktionalen Programmierung einfachere Lösungen. Funktionen können dort als Daten an andere Funktionen übergeben werden können, wodurch Entwurfsmuster wie <a title="Command-Muster" href="http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster)">Command</a> oder <a title="Strategy-Muster" href="http://de.wikipedia.org/wiki/Strategie_(Entwurfsmuster)">Strategy</a> durch die Übergabe von Funktionen ersetzt werden können. Ich werde auf dieses Thema in einem anderen Blogpost eingehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2009/04/14/was-ist-funktionale-programmierung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

