Συναρτησιακός προγραμματισμός

Στην επιστήμη υπολογιστών, συναρτησιακός προγραμματισμός είναι ένα προγραμματιστικό παράδειγμα που αντιμετωπίζει τον υπολογισμό ως την αποτίμηση μαθηματικών συναρτήσεων και αποφεύγει την κατάσταση προγράμματος και τα μεταβλητά δεδομένα. Δίνει έμφαση στην εφαρμογή συναρτήσεων, σε αντίθεση με τον προστακτικό προγραμματισμό, ο οποίος δίνει έμφαση στις αλλαγές κατάστασης. Ο συναρτησιακός προγραμματισμός έχει τις ρίζες του στο λογισμό λάμδα, ένα τυπικό σύστημα που αναπτύχθηκε τη δεκαετία 1930 για τη διερεύνηση του ορισμού συναρτήσεων, της εφαρμογής συναρτήσεων και της αναδρομής. Πολλές συναρτησιακές γλώσσες προγραμματισμού μπορούν να θεωρηθούν επεκτάσεις του λογισμού λάμδα. Πρακτικά, η διαφορά μεταξύ μιας μαθηματικής συνάρτησης και της έννοιας της "συνάρτησης" που χρησιμοποιείται στον προστακτικό προγραμματισμό είναι ότι οι προστακτικές συναρτήσεις μπορούν να έχουν παρενέργειες, αλλάζοντας την τιμή των ήδη αποτιμημένων υπολογισμών. Λόγω αυτού, δεν έχουν διαφάνεια αναφορικότητας, δηλαδή η ίδια έκφραση της γλώσσας μπορεί να δώσει διαφορετικές τιμές ανάλογα με την κατάσταση του εκτελούμενου προγράμματος. Αντίστροφα, σε συναρτησιακά προγράμματα, η τιμή που επιστρέφει μια συνάρτηση εξαρτάται μόνο από τα ορίσματα που αποτελούν την είσοδο της συνάρτησης. Έτσι, η κλήση μιας συνάρτησης f με ένα όρισμα x θα δώσει το ίδιο αποτέλεσμα f(x) και τις δύο φορές. Η εξάλειψη των παρενεργειών μπορεί να κάνει πολύ ευκολότερο το να κατανοηθεί και να προβλεφθεί η συμπεριφορά ενός προγράμματος. Αυτό είναι ένα από τα κίνητρα για την ανάπτυξη του συναρτησιακού προγραμματισμού. Οι συναρτησιακές γλώσσες προγραμματισμού, και ειδικότερα οι αμιγώς συναρτησιακές συναντώνται περισσότερο στο ακαδημαϊκό παρά στο εμπορικό ή βιομηχανικό περιβάλλον. Παρ' όλα αυτά, αξιοσημείωτες συναρτησιακές γλώσσες που χρησιμοποιούνται στη βιομηχανία και στην ανάπτυξη εμπορικών εφαρμογών είναι ανάμεσα σε άλλες η Erlang, η OCaml, η Haskell, η Scheme, αλλά και γλώσσες ειδικών πεδίων όπως η R για τη στατιστική, η Mathematica για τα συμβολικά μαθηματικά, ή η K για την χρηματιστηριακή ανάλυση. Διαδεδομένες γλώσσες ειδικού πεδίου όπως η SQL και τα Lex/Yacc χρησιμοποιούν στοιχεία συναρτησιακού προγραμματισμού, ειδικά για να αποφύγουν μεταβλητές τιμές. Τα λογιστικά φύλλα μπορούν επίσης να θεωρηθούν συναρτησιακές γλώσσες προγραμματισμού. Προγραμματισμός σε συναρτησιακό στυλ μπορεί να επιτευχθεί και σε μη συναρτησιακές γλώσσες όπως η C, η Java και η Python, που δεν είναι ειδικά σχεδιασμένες για τέτοια χρήση.

 Ο λ-λογισμός παρέχει το θεωρητικό υπόβαθρο για την περιγραφή συναρτήσεων και της αποτίμησής τους. Αν και είναι περισσότερο μαθηματική αφαίρεση παρά γλώσσα προγραμματισμού, αποτελεί τη βάση σχεδόν όλων των συναρτησιακών γλωσσών προγραμματισμού. Ένα ισοδύναμο μαθηματικό σύστημα, η συνδυαστική λογική, θεωρείται γενικά πιο αφηρημένο και παλαιότερο από το λογισμό λάμδα. Τόσο η συνδυαστική λογική και ο λογισμός λάμδα αναπτύχθηκαν αρχικά για να επιτευχθεί μια πιο καθαρή προσέγγιση στη θεμελίωση των μαθηματικών. Μια από τις πρώτες συναρτησιακές γλώσσες ήταν η LISP, που αναπτύχθηκε από τον Τζον Μακάρθι στο MIT στη δεκαετία του 1950. Η LISP εισήγαγε πολλά στοιχεία που βρίσκονται σε πολλές συναρτησιακές γλώσσες, αν και τυπικά είναι πολυ-παραδειγματική γλώσσα. Η Scheme και η Dylan ήταν μεταγενέστερες προσπάθειες να απλοποιηθεί και να βελτιωθεί η LISP. Η IPL αναφέρεται κάποιες φορές ως η πρώτη συναρτησιακή γλώσσα προγραμματισμού. Είναι μια συμβολική γλώσσα που επεξεργάζεται λίστες από σύμβολα. Περιλαμβάνει την έννοια της γεννήτριας, μιας συνάρτησης που δέχεται άλλες συναρτήσεις ως ορίσματα, κάτι που μπορεί να ερμηνευτεί ως συναρτήσεις υψηλότερης τάξης. Ο Κένεθ Ίβερσον ανέπτυξε την γλώσσα APL στην αρχή της δεκαετίας του 1960, που περιγράφεται στο βιβλίο του A Programming Language (ISBN 978-0-471-43014-8). Η APL ήταν η βασική επιρροή για την FP του Τζον Μπάκους. Στο μέσο της δεκαετίας του 1990, ο Άρθουρ Γουίτνυ, που είχε εργαστεί προηγουμένως με τον Ίβερσον, δημιούργησε την γλώσσα K, η οποία χρησιμοποιείται εμπορικά στη χρηματοοικονομική βιομηχανία. Ο Τζον Μπάκους παρουσίασε τη γλώσσα FP στη διάλεξη που έδωσε για το βραβείο Τούριγκ το 1977 με τίτλο "Can Programming Be Liberated From the von Neumann Style? A Functional Style and its Algebra of Programs" Αρχειοθετήθηκε 2007-06-21 στο Wayback Machine.. Ορίζει τα συναρτησιακά προγράμματα ως κατασκευασμένα με ιεραρχικό τρόπο, με «συνδυασμό μορφών» που επιτρέπει μια «άλγεβρα προγραμμάτων». Σε σύγχρονη γλώσσα, αυτό σημαίνει ότι τα συναρτησιακά προγράμματα ακολουθούν την αρχή της σύνθεσης. Η δημοσίευση του Μπάκους έκανε δημοφιλή την έρευνα στο συναρτησιακό προγραμματισμό, αν έδωσε έμφαση στον προγραμματισμό σε επίπεδο συναρτήσεων, αντί του ύφους του λογισμού λάμδα, το οποίο τελικά έμελλε να συνδεθεί με τον συναρτησιακό προγραμματισμό. Στη δεκαετία του 1970, η γλώσσα ML δημιουργήθηκε από τον Ρόμπιν Μίλνερ στο Πανεπιστήμιο του Εδιμβούργου. Ο Ντέιβιντ Τέρνερ ανέπτυξε αρχικά τη γλώσσα SASL στο Πανεπιστήμιο του Αγ. Ανδρέα και αργότερα τη γλώσσα Miranda στο Πανεπιστήμιο του Κεντ. Η ML τελικά αναπτύχθηκε σε διάφορες διαλέκτους, η πιο διαδεδομένες από τις οποίες είναι η OCaml και η Standard ML. Επίσης τη δεκαετία του 1970, η ανάπτυξη της γλώσσας Scheme (μιας μερικώς συναρτησιακής διαλέκτου της LISP), όπως περιγράφεται στα lambda papers και στο βιβλίο Structure and Interpretation of Computer Programs, διεύρυνε την κατανόηση για τη δύναμη του συναρτησιακού προγραμματισμού στην ευρύτερη κοινότητα των γλωσσών προγραμματισμού. Στη δεκαετία του 1980, ο Περ Μαρτίν-Λόφ ανέπτυξε την διαισθητική θεωρία τύπων (intuitionistic type theory), γνωστή και ως κατασκευαστική (constructive) θεωρία τύπων, η οποία συνέδεσε τα συναρτησιακά προγράμματα με κατασκευαστικές αποδείξεις οσοδήποτε πολύπλοκων μαθηματικών προτάσεων, που εκφράζονται με εξαρτημένους τύπους. Αυτό οδήγησε σε ισχυρές νέες προσεγγίσεις στην διαδραστική απόδειξη θεωρημάτων και έχει επηρεάσει την ανάπτυξη πολλών μεταγενέστερων συναρτησιακών γλωσσών προγραμματισμού. Η γλώσσα Haskell δημοσιεύτηκε στο τέλος της δεκαετίας του 1980, σε μια προσπάθεια να συνδυαστούν πολλές ιδέες από την έρευνα στο συναρτησιακό προγραμματισμό. Αναγωγή γράφου Λογισμός λάμδα Agda Coq Haskell