Haskell

Η **Haskell**  είναι μια πρότυπη αμιγώς συναρτησιακή γλώσσα προγραμματισμού γενικής χρήσης με μη-αυστηρή σημασιολογία και ισχυρούς τύπους. Πήρε το όνομά της από τον επιστήμονα της λογικής Haskell Curry. Στη Haskell, "μια συνάρτηση είναι μέλος πρώτης τάξης" της γλώσσας προγραμματισμού. Ως συναρτησιακή γλώσσα προγραμματισμού, χρησιμοποιεί σαν κύρια δομή ελέγχου τη συνάρτηση. Η γλώσσα βασίζεται στις παρατηρήσεις του Haskell Curry (1934, 1958) και των πνευματικών του απογόνων, ότι "μια απόδειξη είναι ένα πρόγραμμα και ο μαθηματικός τύπος που αποδεικνύει είναι ο τύπος του προγράμματος".

## Ιστορία

Ακολουθώντας την κυκλοφορία της Miranda από τη Research Software Ltd, το 1985, αυξήθηκε το ενδιαφέρον για τις οκνηρές συναρτησιακές γλώσσες προγραμματισμού: μέχρι το 1987, υπήρχαν περισσότερες από δέκα μη-αυστηρές, αμιγώς συναρτησιακές γλώσσες προγραμματισμού. Η Miranda ήταν η πιο δημοφιλής από αυτές αλλά δεν ήταν ελεύθερη για όλες τις χρήσες (public domain). Στο συνέδριο Functional Programming Languages and Computer Architecture (FPCA '87) στο Πόρτλαντ του Όρεγκον των ΗΠΑ, κατά τη διάρκεια συνάντησης, οι συμμετέχοντες συμφώνησαν ότι θα έπρεπε να δημιουργηθεί μια επιτροπή για να δημιουργήσει ένα ανοιχτό πρότυπο για αυτού του τύπου τις γλώσσες. Ο σκοπός της επιτροπής θα ήταν να αποκρυσταλλώσει τα χαρακτηριστικά των υπάρχουσων γλωσσών συναρτησιακού προγραμματισμού σε μια κοινή γλώσσα που θα χρησιμοποιούνταν σαν βάση για μελλοντικές έρευνες στη σχεδίαση συναρτησιακών γλωσσών.

### Haskell 1.0
Η πρώτη έκδοση της Haskell ("Haskell 1.0") ορίστηκε το 1990. Οι προσπάθειες της επιτροπής είχαν σαν αποτέλεσμα μια σειρά από ορισμούς της γλώσσας.

### Haskell 98
Προς το τέλος του 1997, η σειρά αυτή κατέληξε στην **Haskell 98**, που είχε σαν στόχο τον ορισμό μιας σταθερής, ελάχιστης και φορητής έκδοσης της γλώσσας, ακολουθούμενο από μια πρότυπη βιβλιοθήκη για τη διδασκαλία της και σαν βάση για μελλοντικές επεκτάσεις. Η επιτροπή ενθάρρυνε τη δημιουργία επεκτάσεων και άλλων εκδόσεων της Haskell 98 μέσω της πρόσθεσης και ενσωμάτωσης πειραματικών χαρακτηριστικών.

Το Φεβρουάριο του 1999, το πρότυπο της γλώσσας Haskell 98 δημοσιεύτηκε ("The Haskell 98 Report"). Τον Ιανουάριο του 2003, μια αναθεωρημένη έκδοση δημοσιεύτηκε ("Haskell 98 Language and Libraries: The Revised Report"). Η γλώσσα συνεχίζει να εξελίσσεται γρήγορα, με την υλοποίηση Glasgow Haskell Compiler (GHC) να απεικονίζει το τρέχον *ντε φάκτο* πρότυπο.

### Haskell Prime
Στις αρχές του 2006, άρχισε η διαδικασία ορισμού του διαδόχου του προτύπου της Haskell 98, το οποίο άτυπα ονομάστηκε **Haskell′** ("Haskell Prime"). Αυτή η σταδιακή διαδικασία αναθεώρησης του ορισμού της γλώσσας συνεχίζεται, παράγοντας μια νέα αναθεώρηση κάθε χρόνο. Η πρώτη αναθεώρηση, η Haskell 2010, ανακοινώθηκε το Νοέμβριο του 2009.

## Χαρακτηριστικά

Η Haskell χρησιμοποιεί οκνηρή αποτίμηση, ταίριασμα προτύπων (pattern matching), συμπερίληψη λιστών (list comprehensions), κλάσεις τύπων (typeclasses), και πολυμορφισμό τύπων. Είναι μια αμιγώς συναρτησιακή γλώσσα, που σημαίνει ότι οι συναρτήσεις της δεν έχουν παρενέργειες. Υπάρχει ένας ξεχωριστός τύπος που απεικονίζει τις παρενέργειες, ορθογώνιος προς τον τύπο των συναρτήσεων. Μια αμιγής συνάρτηση μπορεί να επιστρέψει μια παρενέργεια, η οποία στη συνέχεια εκτελείται, μοντελοποιώντας με αυτόν τον τρόπο τις μη-αμιγείς (impure) συναρτήσεις των άλλων γλωσσών.

Η Haskell έχει ένα ισχυρό σύστημα τύπων βασισμένο στην εξαγωγή τύπων. Η βασική συνεισφορά της Haskell σε αυτό το πεδίο είναι η προσθήκη των κλάσεων τύπων, οι οποίες αρχικά δημιουργήθηκαν σαν ένας αυστηρός τρόπος να προστεθεί η υπερφόρτωση στη γλώσσα, αλλά στη συνέχεια βρήκαν επιπλέον χρήσεις.

Ο τύπος που απεικονίζει τις παρενέργειες είναι ένα παράδειγμα μίας Μονάδας. Οι Μονάδες είναι ένα γενικό πλαίσιο που μπορεί να μοντελοποιήσει διαφορετικούς τρόπους υπολογισμού, όπως η διαχείριση λαθών, ο μη-ντετερμινισμός, η λεξιλογική ανάλυση και η μνήμη συναλλαγών σε λογισμικό (software transactional memory). Οι Μονάδες ορίζονται σαν απλοί τύποι δεδομένων αλλά η Haskell παρέχει κάποιες συντακτικές διευκολύνσεις (syntactic sugar) για τη χρήση τους.

Η γλώσσα έχει έναν ανοιχτό και δημοσιευμένο ορισμό, και υπάρχουν πολλες υλοποιήσεις.

Υπάρχει μια ζωντανή κοινότητα γύρω από τη γλώσσα και περισσότερο από 1700 βιβλιοθήκες ανοιχτού κώδικα και εργαλεία από τρίτους είναι διαθέσιμα στη διαδικτυακή βιβλιοθήκη πακέτων Hackage.

Η βασική υλοποίηση της Haskell, ο GHC, είναι ταυτόχρονα ένας διερμηνέας και ένας μεταγλωττιστής σε κώδικα μηχανής για πολλές πλατφόρμες. Ο GHC διακρίνεται για την υψηλής απόδοσης υλοποίηση του ταυτοχρονισμού και του παραλληλισμού, και για το πλούσιο σύστημα τύπων του που περιέχει πρωτοποριακά χαρακτηριστικά όπως οι γενικευμένοι αλγεβρικοί τύποι δεδομένων και οι Οικογένειες Τύπων (Type Families).

## "Hello World!"
Ακολουθεί ένα πρόγραμμα που εμφανίζει τη φράση "Hello world" σε Haskell (όλες οι γραμμές μπορούν να παραλειφθούν εκτός της τελευταίας):

```haskell
module Main where

main :: IO ()
main = putStrLn "Hello World!"
```


### Άλλα παραδείγματα

Η συνάρτηση "παραγοντικό" σε Haskell, ορισμένη με τέσσερις διαφορετικούς τρόπους:


```haskell
-- με αναδρομή
factorial 0 = 1
factorial n = n * factorial (n - 1)

-- με λίστες
factorial n = product [1..n]

-- με αναδρομή αλλά χωρίς pattern matching
factorial n = if n > 0 then n * factorial (n-1) else 1

-- με χρήση μόνο προθεματικής σύνταξης και n+k-προτύπων
factorial 0 = 1
factorial (n+1) = (*) (n+1) (factorial n)
```


Μια αποδοτική υλοποίηση της σειράς Fibonacci, σαν άπειρη ακολουθία:

```haskell
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
```


## Υλοποιήσεις

Οι εξής υλοποιήσεις συμφωνούν εντελώς ή κατά πολύ μεγάλο ποσοστό, με το πρότυπο Haskell 98, και διανέμονται κάτω από άδεις ανοιχού κώδικα. Προς το παρόν δεν υπάρχουν κλειστές υλοποιήσεις της Haskell.

* Ο **[[Glasgow Haskell Compiler]]** (GHC) μεταγλωττίζει σε γλώσσα μηχανής για αρκετές αρχιτεκτονικές, καθώς και σε C— χρησιμοποιώντας τη C-- σαν ενδιάμεση γλώσσα. Ο GHC είναι μάλλον ο πιο δημοφιλής μεταγλωττιστής της Haskell και υπάρχουν αρκετές χρήσιμες βιβλιοθήκες (π.χ. για χρήση της OpenGL) που λειτουργούν μόνο με τον GHC.
* Η **Gofer** ήταν μια εκπαιδευτική διάλεκτος της Haskell, με ένα χαρακτηριστικό που ονομάζόταν "κατασκευαστές κλάσεων" ("constructor classes"), που αναπτύχθηκε από τον Mark Jones. Τη διαδέχτηκε ο Hugs (βλ. παρακάτω).
* Ο **[http://www.cs.chalmers.se/~augustss/hbc/hbc.html HBC]** είναι άλλος ένας μεταγλωττιστής από Haskell σε κώδικα μηχανής. Αν και δεν έχει συνεχιστεί η ανάπτυξή του εδώ και αρκετό καιρό, είναι χρήσιμος.
* Η **Helium** είναι μια νέα διάλεκτος της Haskell. Στόχος της είναι να βοηθά την εκμάθησή της μέσά από φιλικότερα μηνύματα λάθους προς το χρήστη. Προς το παρόν δεν έχει πλήρη υποστήριξη των κλάσεων τύπων, με αποτέλεσμα να μην είναι συμβατή με πολλά προγράμματα σε Haskell.
* Ο **[http://www.cs.uu.nl/wiki/UHC Utrecht Haskell Compiler] ** (UHC) είναι μια υλοποίηση της Haskell από το Πανεπιστήμιο της Ουτρέχτης. Ο UHC υποστηρίζει σχεδόν όλα τα χαρακτηριστικά της Haskell 98 και επιπλέον αρκετές πειραματικές επεκτάσεις. Έχει υλοποιηθεί χρησιμοποιώντας γραμματικές χαρακτηριστικών και προς το παρόν χρησιμοποιείται στην έρευνα των παραγόμενων συστημάτων τύπων και επεκτάσεων της γλώσσας.
* Ο **Hugs**, ή **Haskell User's Gofer System**, είναι ένας διερμηνέας φορητού κώδικα byte (bytecode). Προσφέρει γρήγορη μεταγλώττιση των προγραμμάτων και ικανοποιητική ταχύτητα εκτέλεσης. Περιλαμβάνει επίσης μια απλή βιβλιοθήκη γραφικών. Ο Hugs είναι καλός για όσους μαθαίνουν τα βασικά της Haskell, αν και είναι σοβαρή υλοποίηση. Είναι η πιο φορητή και ελαφρή υλοποίηση της Haskell.
* Ο **[http://repetae.net/john/computer/jhc/ Jhc]** είναι ένας μεταγλωττιστής της Haskell από τον John Meacham που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα των παραγόμενων προγραμμάτων, καθώς και στην εξερεύνηση νέων μετασχηματισμών προγραμμάτων. Ο LHC είναι μια νέα παράλληλη έκδοση του Jhc.
* Ο **[http://www.cs.york.ac.uk/fp/nhc98/ nhc98] ** είναι άλλος ένας μεταγλωττιστής φορητού κώδικα byte αλλά ο κώδικάς του εκτελείται πολύ γρηγορότερα από αυτόν του Hugs. Ο Nhc98 στοχεύει στην ελαχιστοποίηση της χρήσης της μνήμης και είναι πολύ καλή λύση για παλαιότερα και λιγότερο ισχυρά μηχανήματα.
* Ο **Yhc**, ή **York Haskell Compiler** είναι μια παράλληλη έκδοση του nhc98, με στόχο να είναι πιο απλός, πιο φορητός και πιο αποδοτικός, περιλαμβάνοντας υποστήριξη για τον Hat, τον tracer της Haskell. Έχει επίσης ένα πίσω μέρος για JavaScript ώστε οι χρήστες να μπορούν να εκτελούν τα προγράμματα σε Haskell στο φυλλομετρητή τους.

### Πλατφόρμα της Haskell
Από τον Ιανουάριο του 2007, οι βιβλιοθήκες και οι εφαρμογές που είναι γραμμένες σε Haskell είναι συγκεντρωμένες στο Hackage, μια διαδικτυακή βάση δεδομένων με λογισμικό Haskell ανοιχτού κώδικα που χρησιμοποιεί το σύστημα πακέτων Cabal. Από τον Απρίλιο του 2010 υπάρχουν διαθέσιμα περίπου 2000 πακέτα.

Το Cabal και τα εργαλεία μεταγλώττισης, όπως το Alex και το Happy, σε συνδυασμό με αρκετές βιβλιοθήκες, αποτελούν την Πλατφόρμα της Haskell (Haskell Platform).

## Εφαρμογές
Η Haskell χρησιμοποιείται όλο και πιο πολύ σε εμπορικές εφαρμογές. Ο Pugs του Audrey Tang είναι μια υλοποίηση της επερχόμενης γλώσσας Perl 6 με ένα διερμηνέα και μεταγλωττιστές που ήταν έτοιμοι για χρήση μερικούς μήνες μετά τη συγγραφή τους, όμοια ο GHC συχνά χρησιμοποιείται σαν δοκιμαστική πλατφόρμα για προχωρημένα χαρακτηριστικά συναρτησιακού προγραμματισμού και βελτιώσεων. Το Darcs είναι ένα σύστημα διαχείρισης εκδόσεων σε Haskell, με αρκετά πρωτοποριακά χαρακτηριστικά. Η διανομή GNU/Linux Linspire επέλεξε τη Haskell για την ανάπτυξη των εργαλείων συστήματος. Ο Xmonad είναι ένας διαχειριστής παραθύρων για το X Window System, γραμμένος αποκλειστικά σε Haskell.

Η Bluespec SystemVerilog είναι μια γλώσσα για τη σχεδίαση ημιαγωγών που είναι επέκταση της Haskell. Επιπλέον τα εργαλεία της Bluespec έχουν υλοποιηθεί σε Haskell. Η Cryptol, μια γλώσσα και σύνολο εργαλείων για την ανάπτυξη και επιβεβαίωση της ορθότητας κρυπτογραφικών αλγορίθμων, έχει υλοποιηθεί σε Haskell. Ο πρώτος μικροπυρήνας που αποδείχτηκε η ορθότητά του με αυστηρές μεθόδους, ο SeL4, αναπτύχθηκε σε Haskell.

## Σχετικές γλώσσες

Η Concurrent Clean είναι ένας κοντινός συγγενής της Haskell, με τη μεγαλύτερη διαφορά από αυτή να είναι η χρήση των τύπων μοναδικότητας (uniqueness types) αντί των Μονάδων για την Είσοδο-Έξοδο (I/O) και τις παρενέργειες.

Έχει αναπτυχθεί μια σειρά από γλώσσες επηρεασμένες από τη Haskell, που όμως έχουν διαφορετικά συστήματα τύπων. Κάποιες από αυτές είναι:

* Η Epigram, μια συναρτησιακή γλώσσα προγραμματισμού με εξαρτώμενους τύπους (dependent types) που χρησιμοποιείται στην απόδειξη των ιδιοτήτων προγραμμάτων
* Η Agda, μια συναρτησιακή γλώσσα προγραμματισμού με εξαρτώμενους τύπους

Άλλες σχετικές γλώσσες είναι η Curry, μια γλώσσα βασισμένη στη Haskell, και η Jaskell, μια συναρτησιακή γλώσσα σεναρίων που τρέχει στην εικονική μηχανή της Java.

Η Haskell έχει χρησιμοποιηθεί σαν δοκιμαστική πλατφόρμα για πολλές νέες ιδέες στη σχεδίαση γλωσσών. Έχουν δημιουργηθεί πολλές εκδόσεις της που εξερευνούν νέες ιδέες, μεταξύ αυτών:

* Parallel Haskell:
** Από το Πανεπιστήμιο της Γλασκώβης. Υποστηρίζει συστάδες (clusters) μηχανημάτων ή πολυεπεξεργαστές. Επίσης η Haskell περιλαμβάνει υποστήριξη για παραλληλισμό συμμετρικών πολυεπεξεργαστών (Symmetric Multiprocessor parallelism).
** Από το MIT.
* Distributed Haskell (γνωστή παλαιότερα σαν Goffin) και Eden
* Η Haskell βασισμένη σε speculative execution, (Eager Haskell)
* Αρκετές αντικειμενοστρεφείς εκδόσεις: Haskell++, O'Haskell και Mondrian.
* Η Generic Haskell είναι μια έκδοση της Haskell με υποστήριξη στο σύστημα τύπων της για προγραμματισμό με generics
* Η O'Haskell, μια επέκταση της Haskell που προσθέτει υποστήριξη για αντικειμενοστρεφή και ταυτόχρονο προγραμματισμό.
* Η Disciple, μια ρητά οκνηρή διάλεκτος της Haskell που υποστηρίζει την ανάθεση (destructive update), computational effects, προβολές πεδίων καθοδηγούμενες από τύπους (type directed field projections) και allied functional goodness.

## Κριτική

Ο Jan-Willem Maessen, το 2002, και ο Simon Peyton Jones, το 2003, συζήτησαν κάποια προβλήματα που προκύπτουν από την οκνηρή αποτίμηση, αναγνωρίζοντας παράλληλα τη θεωρητική ανάγκη για την ύπαρξή της, και για πρακτικά θέματα όπως η βελτιωμένη απόδοση. Σημειώνουν ότι η οκνηρή αποτίμηση προσθέτει κάποια επιβάρυνση στην απόδοση του προγράμματος και δυσκολεύει τους προγραμματιστές στην κατανόηση της αποδοτικότητας του κώδικά τους (ειδικά όσον αφορά τη χρήση του χώρου στη μνήμη).

Ο Bastiaan Heeren, ο Daan Leijen, και ο Arjan van IJzendoorn το 2003 επίσης εντόπισαν κάποια σημεία που δυσκολεύουν όσους μαθαίνουν Haskell: "Η περίπλοκη σύνταξη και το σύστημα τύπων της Haskell είναι δίκοπο μαχαίρι - οι έμπειροι προγραμματιστές το εκτιμούν αλλά αποτελεί πηγή προβλημάτισμού μεταξύ των αρχάριων επειδή η γενικότητα της Haskell συχνά οδηγεί σε δυσνόητα μηνύματα λάθους". Για να αντιμετωπίσουν αυτό το πρόβλημα ανέπτυξαν ένα προχωρημένο διερμηνέα, τον Helium, που βελτίωσε την ευχρηστία των μηνυμάτων λάθους περιορίζοντας τη γενικότητα κάποιων χαρακτηριστικών της Haskell, με κυριότερο χαρακτηριστικό την απομάκρυνση της υποστήριξης κλάσεων τύπων.

## Συνέδρια (conferences) και workshops

Η κοινότητα της Haskell έχει συχνές συναντήσεις για ζητήματα έρευνας και ανάπτυξης. Οι πιο συχνές είναι:
* The Haskell Symposium (πρώην Haskell Workshop)
* The Haskell Implementors Workshop
* The International Conference on Functional Programming

Από το 2007 έχει υπάρξει μια σειρά από οργανωμένους "hackathons"— Hac —που στοχεύουν στη βελτίωση των εργαλείων και των βιβλιοθηκών της γλώσσας.

Από το 2005, έχει δημιουργηθεί ένα αυξανόμενο πλήθος από Haskell User Groups, στις Ηνωμένες Πολιτείες, τον Καναδά, την Αυστραλία, τη Νότιο Αμερική, την Ευρώπη και την Ασία.

## Δείτε επίσης
* Αναγωγή γράφου
* Miranda

## Παραπομπές


## Εξωτερικοί σύνδεσμοι

* HaskellWiki – η σελίδα της Haskell 
* A History of Haskell: being lazy with class – ιστορία της Haskell 
* The Evolution of a Haskell Programmer – μια χιουμοριστική σύνοψη των στυλ προγραμματισμού σε Haskell 
* An Online Bibliography of Haskell Research 
* SE-Radio Podcast with Simon Peyton Jones on Haskell 
* Techworld interview on innovations of Haskell 
* The Haskell Sequence, εβδομαδιαία νέα της Haskell 
* Monad Reader, τετραμηνιαίο περιοδικό με θέματα πάνω στη Haskell 
* 

### Εισαγωγικά κείμενα
* Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell
* Real World Haskell – ένα βιβλίο που γρήγορα καλύπτει αρκετό υλικό και εστιάζει σε πρακτικά παραδείγματα (άδεια Creative Commons) 
* Learn You a Haskell For Great Good!  – χιουμοριστικό εισαγωγικό κείμενο με εικόνες 
* Yet Another Haskell Tutorial – εισαγωγή στη Haskell από τον Hal Daume III, προϋποθέτει λιγότερες γνώσεις σε σχέση με το επίσημο εισαγωγικό κείμενο της γλώσσας 
* A Gentle Introduction to Haskell 98 (ένα πιο προχωρημένο εισαγωγικό κείμενο, διαθέσιμο και ως αρχείο pdf) 
* The Haskell Cheatsheet Συμπυκνωμένο κείμενο αναφοράς στη γλώσσα και μικρό εισαγωγικό κείμενο. 

Haskell
Haskell