www.wikidata.de-de.nina.az
Funktionale Programmierung ist ein Programmierparadigma in dem Funktionen nicht nur definiert und angewendet werden konnen sondern auch wie Daten miteinander verknupft als Parameter verwendet und als Funktionsergebnisse auftreten konnen Dadurch kann ein funktionales Programm sehr weitreichend neue Berechnungsvorschriften zur Laufzeit zusammensetzen und anwenden Programmiersprachen die funktionale Programmierung ermoglichen werden als funktionale Programmiersprachen bezeichnet Die funktionale Programmierung entspringt der mathematischen Grundlagenforschung In den 1930er Jahren entwickelte Alonzo Church den Lambda Kalkul als Instrument um das Entscheidungsproblem zu bearbeiten und dazu den Begriff der berechenbaren Funktion zu definieren Der Lambda Kalkul selbst beschaftigt sich nicht mit bestimmten Funktionen sondern ist nur ein Regelwerk dafur wie die Anwendung von Funktionen auf ihre Argumente erfolgt und wie dabei mit freien und gebundenen Variablen verfahren wird Die besonderen Eigenschaften der funktionalen Programmierung ermoglichen es auf die in der imperativen Programmierung benotigten inneren Zustande eines Berechnungsprozesses ebenso zu verzichten wie auf die zugehorigen Zustandsanderungen die auch Seiteneffekte genannt werden Der Verzicht auf die Seiteneffekte vereinfacht auf der einen Seite die semantische Analyse eines Computerprogramms erheblich und eroffnet auf der anderen Seite weitreichende Moglichkeiten zur regelbasierten algebraischen Programmtransformation und synthese Daraus ergibt sich die erhebliche praktische Bedeutung der funktionalen Programmierung fur die Informatik Eine weitere Konsequenz ist dass es in funktionaler Programmierung besonders einfach ist Algorithmen ohne Berucksichtigung der Beschaffenheit der bearbeiteten Datenobjekte zu beschreiben und dadurch generischen Programmcode zu erstellen Viele funktionale Verfahren sind so generisch dass sie seit den 1950er Jahren keiner Anpassung unterworfen werden mussten Die erste bedeutende in funktionaler Programmierung erstellte Software ist der von John McCarthy im Jahr 1958 erstellte metazirkulare Lisp Interpreter mit Namen eval der die Semantik von LISP aus funf einfachen Funktionen zusammengesetzt darstellt Er findet auf einer DIN A4 Seite Platz und ist bis heute konzeptionelle Grundlage fur die Implementierung der meisten Programmiersprachen Inhaltsverzeichnis 1 Definition 2 Funktionale Programmiersprachen 3 Mathematische Konzepte 3 1 Listen 3 2 Katamorphismen 3 3 Anamorphismen 3 4 Hylomorphismen 4 Abgrenzung von imperativer Programmierung 5 Lambda Kalkul 6 Typsystem 7 Rein funktionale Programmiersprachen 8 Funktionen hoherer Ordnung 9 Bedarfsauswertung und strikte Auswertung 10 Funktionale Algorithmen und Datenstrukturen 11 Beispiele 11 1 Common Lisp 11 2 F und OCaml 11 3 Haskell 11 4 Joy 11 5 Julia 11 6 Python 11 7 Matlab 11 8 Scala 11 9 Kotlin 11 10 Java 11 11 Scheme 11 12 SML 11 13 Swift 11 14 XSLT 12 Siehe auch 13 Literatur 14 Weblinks 15 EinzelnachweiseDefinition BearbeitenDie funktionale Programmierung ist durch folgende Eigenschaften gekennzeichnet Computerprogramme werden als Funktionen verstanden die fur eine Eingabe eine Ausgabe liefern die nur von dieser abhangig ist Funktionen werden nicht als Abfolge von Anweisungen dargestellt sondern als ineinander verschachtelte Funktionsaufrufe Funktionen sind gegenuber allen anderen Datenobjekten gleichberechtigt Das bedeutet dass sie als Parameter in Funktionen eingehen durfen und ebenso als Berechnungsergebnisse aus Funktionen hervorgehen konnen Insbesondere konnen Funktionen wie andere Datenobjekte zur Laufzeit erstellt werden oder entfallen Eine Funktion kann auf Variablen Bezug nehmen die dem Kontext angehoren in dem ihre Erstellung erfolgt ist Dies kann sie auch dann noch tun wenn sie den Kontext verlassen hat Die Belegung der Variablen zum Zeitpunkt des Verlassens dieses Kontextes wird dann innerhalb dieser Funktion eingefroren Eine so entstandene Funktion heisst Closure und die eingefrorenen Variablenbelegungen heissen Closure Variablen Funktionsdefinitionen konnen insbesondere bei Funktionsanwendungen ohne explizite Namensgebung literal in der Stellung des Funktionssymbols stehen Solche Funktionen heissen anonym und werden oft salopp Lambdas genannt Funktionale Programmiersprachen BearbeitenEine funktionale Programmiersprache ist eine Programmiersprache die die oben genannten Eigenschaften implementiert Wichtige Vertreter funktionaler Programmiersprachen sind Lisp und Haskell Fast alle in jungster Zeit entstandenen Programmiersprachen gestatten funktionale Programmierung Zur funktionalen Programmierung gedachte Sprachen sind neben anderen LISP ML Haskell OCaml F Erlang Clojure und Scala Sprachen die funktionale Programmierung neben anderen Paradigmen ermoglichen sind zum Beispiel Perl ECMAScript Dylan Ruby und Visual Basic NET Python hat Einschrankungen bei der Formulierung von anonymen Funktionen Populare Sprachen die keinerlei Moglichkeiten zur funktionalen Programmierung bieten sind zum Beispiel C und altere Delphi Versionen ab 2010 werden Closures bzw anonyme Funktionen unterstutzt Unter einer rein funktionalen Programmiersprache ware eine Programmiersprache zu verstehen die isomorph zum Lambda Kalkul ist Das gilt mit minimalen Einschrankungen beispielsweise fur die esoterische Programmiersprache unlambda Viele eigentlich objektorientierte Sprachen wurden in jungsten Versionen aufgerustet wie C ab Version 11 oder Java ab Version 8 Allerdings leidet darunter die Syntax sodass die Kompaktheit von LISP oder Haskell nicht erreicht wird Mathematische Konzepte BearbeitenDie allgemeingultigen Konzepte der funktionalen Programmierung entstammen der Mathematik der 1930er und 1940er Jahre Von besonderer Bedeutung sind der Lambda Kalkul und die Kategorientheorie Der Lambda Kalkul ist ein operatives Regelwerk mit dessen Hilfe die Bedeutung von symbolischen Ausdrucken bestimmt werden kann Kategorientheoretisch Kategorientheorie sind Datentypen Objekte und Funktionen Morphismen die zwischen diesen abbilden und fur die die gewohnliche Funktionskomposition als zweistellige assoziative Verknupfung und die Identitats Abblildung als neutrales Element definiert ist Damit bilden die Funktionen eine Gruppe ohne das Gesetz vom inversen Element Listen Bearbeiten In der imperativen Programmierung ubliche Datenstrukturen wie Arrays sind in der funktionalen Programmierung schwierig im Gebrauch da sie durch Rekursion nur schwierig darstellbar sind auch wenn es Ansatze wie das Functional Programming System gibt die explizit mit solchen Strukturen arbeiten Listen und Baume sind hingegen sehr gut mit der Funktionalen Programmierung vertraglich Sei A displaystyle A ein beliebiger Datentyp Dann ist der Typ A displaystyle A der beliebig langen Listen mit mindestens 0 Elementen des Typs A displaystyle A gegeben durch die Rekursion A N i l C o n s A A displaystyle A Nil Cons A A Dabei ist N i l displaystyle Nil die leere Liste und C o n s A A A displaystyle Cons A times A to A eine zweistellige Operation die aus einem Wert a displaystyle a und einer Liste L displaystyle L eine neue Liste M displaystyle M konstruiert indem sie a displaystyle a vorne an L displaystyle L anhangt Man kann diesen rekursiven Aufbau benutzen um Funktionen h A B displaystyle h colon A to B zu schreiben die eine Liste zerlegen und dabei einen Wert ermitteln Eine solche Funktion h displaystyle h heisst Katamorphismus Katamorphismen Bearbeiten Sei B displaystyle B ein Datentyp b B displaystyle b in B ein Wert und A B B displaystyle otimes colon A times B to B eine Abbildung Dann ist durch h A B N i l b C o n s a L a h L displaystyle begin aligned h colon A amp to B Nil amp mapsto b Cons a L amp mapsto a otimes h L end aligned der Katamorphismus zu griech kata entlang herab mit Initialwert b displaystyle b und Verknupfung displaystyle otimes gegeben In der ublichen Notation mit Bananenklammern wird er als h b displaystyle h b otimes geschrieben Im Sinne der funktionalen Programmierung ist die Zirkumfix Operation displaystyle cdot cdot eine Funktion hoherer Ordnung In funktionalen Programmiersprachen gibt es zur Berechnung von Katamorphismen die Funktion reduce oder fold Ein Katamorphismus der obiger Definition folgt ist rechtshandig Er entspricht der folgenden Programmschleife die eine Liste von ihrem Ende her traversiert x b F o r i L e n g t h L Downto 1 Do x L i x E n d R e t u r n x displaystyle begin aligned amp x b amp For i Length L text Downto 1 text Do amp x L i otimes x amp End amp Return x end aligned Ein linkshandiger Katamorphismus wurde beim Index 1 beginnen Viele grundlegende Verfahren der Programmierung sind Katamorphismen So berechnet 0 displaystyle 0 die Summe einer Zahlenliste ϵ displaystyle epsilon cdot hangt Strings aneinander und 0 I n c displaystyle 0 Inc mit I n c n k k 1 displaystyle Inc n k mapsto k 1 berechnet die Lange einer Liste Eine Funktion die eine Liste l displaystyle l nach Elementen filtert die die Eigenschaft p displaystyle p erfullen kann mit der Funktion f i l t e r displaystyle filter aus p displaystyle p errechnet werden die wie folgt definiert ist f i l t e r p N i l f displaystyle filter p mapsto Nil f mit f C o n s a L C o n s a L displaystyle f Cons a L mapsto Cons a L falls p a displaystyle p a und f C o n s a L L displaystyle f Cons a L mapsto L sonst Ist die Operation h displaystyle h assoziativ mit dem neutralen Element displaystyle emptyset dann ist der Katamorphismus h displaystyle emptyset h die eindeutige Erweiterung der Operation h displaystyle h auf beliebig viele Argumente Das ist eine nutzliche Eigenschaft die viel Arbeit in der praktischen Programmierung einsparen kann Ist zum Beispiel eine zweistellige Funktions Komposition f g displaystyle f circ g bereits implementiert so lasst sich die Komposition i 1 n f i displaystyle bigodot i 1 n f i von n displaystyle n Funktionen als i d displaystyle id circ darstellen dabei ist i d displaystyle id die identische Abbildung Anamorphismen Bearbeiten Wahrend Katamorphismen Listen zu Einzelwerten reduzieren bauen Anamorphismen Listen aus Einzelwerten auf Die Begriffe sind dual zueinander Es sei p B w f displaystyle p colon B to w f ein Pradikat und g B A B displaystyle g colon B to A times B eine Abbildung Ein Anamorphismus h B A displaystyle h colon B to A ist dann so definiert h b N i l falls p b w b C o n s a h b mit a b g b falls p b f displaystyle begin aligned h b amp mapsto Nil text falls p b w b amp mapsto Cons a h b text mit a b g b text falls p b f end aligned Der Anamorphismus mit Generator g displaystyle g und Pradikat p displaystyle p wird mit Linsenklammern notiert h p g displaystyle h p g Ein Beispiel fur einen einfachen Anamorphismus ist die Funktion i i i lt 1 i i i 1 displaystyle iota i mapsto i lt 1 i mapsto i i 1 Sie errechnet aus einer naturlichen Zahl n displaystyle n die umgedrehte Liste der ersten n displaystyle n naturlichen Zahlen i n n n 1 n 2 1 displaystyle iota n n n 1 n 2 1 Hylomorphismen Bearbeiten Sei z f displaystyle z f ein Katamorphismus und p g displaystyle p g ein Anamorphismus Dann ist die Abbildung z f p g displaystyle z f circ p g ein sogenannter Hylomorphismus griech ylh Holz Material Hylomorphismen sind in der Lage einen ganzen Verarbeitungsprozess darzustellen innerhalb dessen eine Struktur durch einen Anamorphismus entwickelt und durch einen Katamorphismus wieder eingedampft wird Diese Darstellung ermoglicht es die durch den Anamorphismus erzeugte Zwischenstruktur algebraisch zu entfernen 1 Die daraus resultierende eigenstandige Darstellung des Hylomorphismus ohne Zwischenstruktur fuhrt in der Praxis zu einer erheblichen Reduktion des benotigten Speicherplatzes Es ist problemlos moglich einen komplexeren Algorithmus wie den Minimax Algorithmus der den besten Zug in einem Zweipersonenspiel wie Schach findet als Hylomorphismus darzustellen 1 Der Hylomorphismus 1 i i lt 1 i i i 1 displaystyle 1 times circ i mapsto i lt 1 i mapsto i i 1 der den Katamorphismus 1 displaystyle 1 times zur Berechnung eines Zahlenprodukts mit dem oben genannten Anamorphismus i displaystyle iota kombiniert berechnet die Fakultat einer Zahl Abgrenzung von imperativer Programmierung BearbeitenIm Gegensatz zu imperativen Programmen die aus Rechenanweisungen bestehen sind funktionale Programme eine Menge von Funktions Definitionen die mathematisch eine partielle Abbildung von Eingabedaten auf Ausgabedaten sind und gleichzeitig selbst aus Funktionsaufrufen zusammengesetzt sind Ein typisches Beispiel ist die Berechnung der Fakultat n einer Zahl n n 1 2 3 n hier eine imperative Losung Eingabe Zahl n Ausgabe Zahl b 1 2 3 n Algorithmus b 1 Zuweisung solange n gt 0 fuhre aus b n b n n 1 Ausgabe b Charakteristisch fur die imperative Programmierung sind hier die Zuweisungen Anderung von Werten durch das Symbol im Pseudocode reprasentiert Zwar berechnet der Algorithmus die Fakultat der Zahl n aber die Korrektheit dieses Rechenweges ist nicht offensichtlich Nun kann man die Fakultat jedoch auch mithilfe von rekursiven Funktionen definieren was zur funktionalen Losung fuhrt n f n n f n 1 f u r n gt 0 1 f u r n 0 displaystyle n f n begin cases n cdot f n 1 amp mathrm f ddot u r n gt 0 1 amp mathrm f ddot u r n 0 end cases Funktion f n wenn n gt 0 dann Ausgabe n f n 1 sonst wenn n 0 dann Ausgabe 1 Die funktionale Programmierung kommt also ohne Schleifen und Zuweisungen aus benotigt dafur aber Rekursion Lambda Kalkul BearbeitenDie theoretische Grundlage der funktionalen Programmierung ist der l Kalkul Lambda Kalkul von Alonzo Church Jeder Ausdruck und jeder Wert wird dabei als auswertbare Funktion betrachtet so dass die ganze Programmierung auf der Ubergabe von Funktionen als Parameter an Funktionen fusst Der Lambda Kalkul erlaubt es vollstandige Teilausdrucke separat auszuwerten Dies ist der wichtigste Vorteil gegenuber der imperativen Programmierung Dieses Konzept vereinfacht die Programmverifikation und Programmoptimierung beispielsweise die Uberfuhrung der Programme in eine parallel auswertbare Form Typsystem BearbeitenHistorisch ist Lisp als die erste funktionale Programmiersprache aufzufassen Sprachen der LISP Familie wie auch Scheme sind dynamisch typisiert Seit der Entwicklung von Standard ML SML konzentriert sich die Forschung auf dem Gebiet der funktionalen Programmiersprachen auch auf statisch typisierte Sprachen insbesondere auf solche die das Typsystem nach Hindley und Milner verwenden Der Vorteil dieses Typsystems ist die Verfugbarkeit von parametrischem Polymorphismus zusammen mit Typinferenz Programmierer mussen die Typen ihrer Funktionen und anderen Werte nicht angeben sondern bekommen sie gratis vom Ubersetzer ausgerechnet der zugleich noch wahrend der Ubersetzung Typfehler monieren kann Dies wird allgemein als wesentlicher Vorteil gegenuber dynamisch typisierten Sprachen Lisp Python aufgefasst die zwar ebenfalls keine Typannotationen benotigen im Gegensatz z B zu Java oder C dafur aber Typfehler erst zur Laufzeit anmahnen konnen Letzteres hat jedoch wiederum den Vorteil einer breiteren Anwendbarkeit bereits definierter Funktionen auf ggf zum Entwicklungszeitpunkt noch nicht vorhergesehene neue Einsatzgebiete Das Hindley Milner System erlaubt allerdings nur Polymorphismus ersten Ranges Erweiterungen fur Polymorphismus zweiten und allgemein k ten Ranges sind inzwischen in dem Haskell Ubersetzer GHC als Erweiterungen verfugbar bedingen jedoch wieder explizite Annotationen Typinferenz ab Polymorphismus zweiten Ranges ist unentscheidbar Rein funktionale Programmiersprachen BearbeitenRein funktionale Programmiersprachen fassen Programme als mathematische Funktion auf Es gibt keine Zustandsvariablen die wahrend einer Berechnung geandert werden Um erwunschte Wirkungen Benutzerinteraktion Eingabe Ausgabe Operationen beschreiben zu konnen sind meist besondere Vorkehrungen notwendig Die meisten funktionalen Programmiersprachen Standard ML Caml Scheme und weitere erlauben allerdings solche Wirkungen und sind daher keine reinen funktionalen Programmiersprachen Um Programmierung auch mit Wirkungen zu erlauben ohne dabei zu einer sog unreinen englisch impure Sprache zu werden wird in der Sprache Haskell das aus der Kategorientheorie stammende Konzept der Monaden verwendet insbesondere von Eugenio Moggi und Philip Wadler welches Wirkbehaftung durch parametrische Typen ausdruckt und somit das Typsystem dazu zwingt zwischen Ausdrucken mit und Ausdrucken ohne Wirkungen zu unterscheiden Auch in Clean und Mercury wird das Typsystem verwendet um solche Wirkungen zu kennzeichnen Dort benutzt man allerdings das Konzept der Uniqueness Typen Funktionen hoherer Ordnung BearbeitenMan unterscheidet Funktionen erster Ordnung und Funktionen hoherer Ordnung Bei Funktionen hoherer Ordnung sind Funktionen selbst Werte Dies erlaubt es insbesondere Funktionen als Ergebnisse oder Argumente anderer Funktionen zu verwenden Ein klassisches Beispiel ist der Ableitungsoperator dessen Darstellbarkeit in Lisp obligatorisch fur das Design dieser Sprache war Eingabe ist eine differenzierbare Funktion Ausgabe ist die Ableitung dieser Funktion Ein einfacheres Standardbeispiel fur eine Funktion hoherer Ordnung ist die Funktion map welche als Eingabe eine Funktion f und eine Liste l erhalt und die modifizierte Liste zuruckgibt die dadurch entsteht dass die Funktion f auf jedes Element der Liste l angewendet wird Definition von map in Haskell map f map f x xs f x map f xs In der ersten Zeile wird das Ergebnis fur eine leere Liste zuruckgegeben die zweite Zeile wendet die Funktion f auf das erste Listenelement x an und fuhrt dann einen Rekursionsschritt fur die restliche Liste xs durch Bedarfsauswertung und strikte Auswertung BearbeitenFunktionale Sprachen kann man auch nach ihrer Auswertungsstrategie unterscheiden Bei strikter Auswertung englisch eager bzw strict evaluation werden die Argumente von Funktionen zuerst ausgewertet Dagegen werden bei der nicht strikten Auswertung zunachst die Ausdrucke als Ganzes ubergeben und dann ausgewertet Man kann zum Beispiel den Ausdruck 3 5 2 displaystyle 3 5 2 auf zwei Arten berechnen 3 5 2 8 2 8 8 64 displaystyle 3 5 2 8 2 8 cdot 8 64 3 5 2 3 5 3 5 8 8 64 displaystyle 3 5 2 3 5 cdot 3 5 8 cdot 8 64 Im ersten Fall wird der Ausdruck strikt ausgewertet da erst die Argumente der Potenz Funktion berechnet werden Im zweiten Fall werden diese Argumente erst bei Bedarf ausgewertet also nachdem die Potenzfunktion aufgelost wurde nicht strikte Auswertung Eine Variante der nicht strikten Auswertung ist die Bedarfsauswertung englisch lazy evaluation bei der Ausdrucke erst ausgewertet werden wenn deren Wert in einer Berechnung benotigt wird Dadurch lassen sich z B unendlich grosse Datenstrukturen die Liste aller naturlicher Zahlen die Liste aller Primzahlen etc definieren und bestimmte Algorithmen vereinfachen sich Manche Berechnungen lassen sich mit strikter Auswertung andere mit Bedarfsauswertung effizienter ausfuhren Terminiert die strikte Auswertung eines Ausdruckes so terminiert auch die nicht strikte Auswertung Hintergrund hiervon ist die Konfluenz Eigenschaft des jeder funktionalen Sprache zugrundeliegenden l Kalkuls die aussagt dass das Ergebnis der Berechnung nicht von der Reihenfolge der Auswertung abhangt Funktionale Algorithmen und Datenstrukturen BearbeitenAlgorithmen geben vorteilhafte Verfahren fur die Losung wichtiger Probleme an z B Sortieren und sind in der Regel gut analysiert so dass ein Entwickler auf bewahrte einschatzbare Losungen zuruckgreifen kann Gleiches leisten Datenstrukturen fur die Organisation von Daten Sammlungen von guten Algorithmen und Datenstrukturen haben somit eine grosse praktische Bedeutung Der Verzicht auf Zuweisungen fuhrt dazu dass etliche klassische Algorithmen und Datenstrukturen die regen Gebrauch von dieser Moglichkeit machen so nicht fur funktionale Sprachen verwendet werden konnen und nach neuen Losungen gesucht werden muss Chris Okasaki schreibt Auch wenn die meisten dieser Bucher uber Datenstrukturen behaupten dass sie unabhangig von einer bestimmten Programmiersprache sind so sind sie leider nur sprachunabhangig im Sinne Henry Fords Programmierer konnen jede Programmiersprache benutzen solange sie imperativ ist Gerade rein funktionale Datenstrukturen sind von ihrer Natur her anders als die gewohnten Datenstrukturen die meist nur eine Version ihrer Daten verwalten ephemere Datenstrukturen wohingegen funktionale Datenstrukturen mehrere Versionen verwalten persistente Datenstrukturen Beispiele BearbeitenFolgende Programme definieren eine Funktion ringarea die die Flache berechnet die zwischen den beiden konzentrischen Kreisen mit den Radien R und r bzw r1 und r2 mit gemeinsamen Mittelpunkt liegt entsprechend dem mathematischen Ausdruck A p r 1 2 r 2 2 displaystyle A pi cdot r 1 2 r 2 2 Dazu werden die Konstante pi und die Hilfsfunktion sq definiert Diese werden von ringarea dann fur die Berechnung benutzt Anmerkung Wir setzen voraus dass r 1 r 2 displaystyle r 1 geq r 2 gilt Common Lisp Bearbeiten defun ringarea r1 r2 flet sq x x x pi sq r1 sq r2 F und OCaml Bearbeiten let ringarea r1 r2 let pi 3 14 in let sq x x x in pi sq r1 sq r2 Haskell Bearbeiten ringArea Floating a gt a gt a gt a ringArea r1 r2 pi sq r1 sq r2 where sq x x x Der Typ der Funktionen sq ringArea ist polymorph und wird durch die Angabe der Typklasse Floating eingegrenzt Die explizite Spezifikation des Typs ist optional und kann ebenso gut durch den Haskell Compiler inferenziert werden Pi ist in Haskell vordefiniert Joy Bearbeiten DEFINE pi 3 14 sq dup ringarea sq swap sq swap pi dd Joy benutzt die umgekehrte polnische Notation Man beachte dass hier alle Variablen Funktionen bezeichnen auch pi ist eine Funktion Julia Bearbeiten pi 3 14 sq x Number x x ringarea R Number r Number pi sq R sq r Python Bearbeiten from math import pi squared lambda x x 2 ringarea lambda r1 r2 pi squared r1 squared r2 Matlab Bearbeiten squared x x 2 ringarea x y pi squared x squared y Scala Bearbeiten val squared Double gt Double x gt x x val ringArea Double Double gt Double outerRadius innerRadius gt math Pi squared outerRadius squared innerRadius Kotlin Bearbeiten val sq Double gt Double x gt x x val ringarea R Double r Double gt PI sq R sq r Es gibt entweder die Moglichkeit den Funktionstyp separat anzugeben oben oder die Parametertypen innerhalb des Lambdas zu definieren unten Java Bearbeiten UnaryOperator lt Double gt sq d gt d d BinaryOperator lt Double gt ringArea outerRadius innerRadius gt Math PI sq apply outerRadius sq apply innerRadius Scheme Bearbeiten define ring area r1 r2 define pi 3 14 define sq x x x pi sq r1 sq r2 SML Bearbeiten let val pi 3 14 val sq fn x real gt x x in fun ringarea R r pi sq R sq r end Der Typ von x muss hier explizit angegeben werden da ein SML97 Ubersetzer sonst den Typ int inferieren wurde Das zugrundeliegende Problem ist das der Uberladung von Operatoren dieses Problem wurde erst mit Einfuhrung von Typklassen gelost allerdings in Haskell und verwandten Sprachen Swift Bearbeiten let pi 3 14 let square x Double gt Double in x x let ringarea r1 Double r2 Double gt Double in pi square r1 square r2 XSLT Bearbeiten XSLT dient dem Transformieren von XML insbesondere in XHTML und hat zusammen mit XML stark an Bedeutung gewonnen Sie ist funktional wie Dimitre Novatchev gezeigt hat 2 Die im folgenden Beispiel 3 definierte Funktion kehrt die Reihenfolge der Worter einer Zeichenkette um Typisch fur funktionale Programmiersprachen ist der rekursive Aufruf Der zweite Absatz zeigt wie die Funktion verwendet wird lt xsl function name str reverse as xs string gt lt xsl param name sentence as xs string gt lt xsl choose gt lt xsl when test contains sentence gt lt xsl sequence select concat str reverse substring after sentence substring before sentence gt lt xsl when gt lt xsl otherwise gt lt xsl sequence select sentence gt lt xsl otherwise gt lt xsl choose gt lt xsl function gt lt xsl template match gt lt output gt lt xsl value of select str reverse DOG BITES MAN gt lt output gt lt xsl template gt Siehe auch BearbeitenInternational Conference on Functional Programming Contest ICFP Contest Algebraische ProgrammierspracheLiteratur BearbeitenChris Okasaki Purely Functional Data Structures Cambridge University Press 1999 ISBN 0 521 66350 4 Patrick M Krusenotto Funktionale Programmierung und Metaprogrammierung Interaktiv in Common Lisp Springer 2016 ISBN 978 3 658 13743 4 Lothar Piepmeyer Grundkurs funktionale Programmierung mit Scala Hanser 2010 ISBN 978 3 446 42092 2 S 297 Fethi Rabhi Guy Lapalme Algorithms A Functional Programming Approach Addison Wesley 1999 ISBN 0 201 59604 0 Weblinks BearbeitenWas ist funktionale Programmierung Fakultat fur Informatik und Mathematik der Universitat Passau Amr Sabry What is a Purely Functional Language In J Functional Programming 8 1 Januar 1998 S 1 22 Carsten Konig Was ist funktionale Programmierung Informatik Aktuell Magazin Andre Schutz Funktionale Programmierung mit Scala Einfuhrung Informatik Aktuell Magazin Einzelnachweise Bearbeiten a b Patrick M Krusenotto Funktionale Programmierung und Metaprogrammierung Springer Wiesbaden 2016 S 217ff S 244 ff The Functional Programming Language XSLT Memento vom 5 Dezember 2008 im Internet Archive Aus der W3C Recommendation XSL Transformations XSLT Version 2 0 Abgerufen von https de wikipedia org w index php title Funktionale Programmierung amp oldid 234246435