Haskell

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Μετάβαση σε: πλοήγηση, αναζήτηση

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

Ιστορία[Επεξεργασία | επεξεργασία κώδικα]

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

Haskell 1.0[Επεξεργασία | επεξεργασία κώδικα]

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

Haskell 98[Επεξεργασία | επεξεργασία κώδικα]

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

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

Haskell Prime[Επεξεργασία | επεξεργασία κώδικα]

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

Χαρακτηριστικά[Επεξεργασία | επεξεργασία κώδικα]

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

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

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

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

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

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

"Hello World!"[Επεξεργασία | επεξεργασία κώδικα]

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

module Main where
 
main :: IO ()
main = putStrLn "Hello World!"

Άλλα παραδείγματα[Επεξεργασία | επεξεργασία κώδικα]

Η συνάρτηση "παραγοντικό" σε 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, σαν άπειρη ακολουθία:

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 (βλ. παρακάτω).
  • Ο HBC είναι άλλος ένας μεταγλωττιστής από Haskell σε κώδικα μηχανής. Αν και δεν έχει συνεχιστεί η ανάπτυξή του εδώ και αρκετό καιρό, είναι χρήσιμος.
  • Η Helium είναι μια νέα διάλεκτος της Haskell. Στόχος της είναι να βοηθά την εκμάθησή της μέσά από φιλικότερα μηνύματα λάθους προς το χρήστη. Προς το παρόν δεν έχει πλήρη υποστήριξη των κλάσεων τύπων, με αποτέλεσμα να μην είναι συμβατή με πολλά προγράμματα σε Haskell.
  • Ο Utrecht Haskell Compiler (UHC) είναι μια υλοποίηση της Haskell από το Πανεπιστήμιο της Ουτρέχτης. Ο UHC υποστηρίζει σχεδόν όλα τα χαρακτηριστικά της Haskell 98 και επιπλέον αρκετές πειραματικές επεκτάσεις. Έχει υλοποιηθεί χρησιμοποιώντας γραμματικές χαρακτηριστικών και προς το παρόν χρησιμοποιείται στην έρευνα των παραγόμενων συστημάτων τύπων και επεκτάσεων της γλώσσας.
  • Ο Hugs, ή Haskell User's Gofer System, είναι ένας διερμηνέας φορητού κώδικα byte (bytecode). Προσφέρει γρήγορη μεταγλώττιση των προγραμμάτων και ικανοποιητική ταχύτητα εκτέλεσης. Περιλαμβάνει επίσης μια απλή βιβλιοθήκη γραφικών. Ο Hugs είναι καλός για όσους μαθαίνουν τα βασικά της Haskell, αν και είναι σοβαρή υλοποίηση. Είναι η πιο φορητή και ελαφρή υλοποίηση της Haskell.
  • Ο Jhc είναι ένας μεταγλωττιστής της Haskell από τον John Meacham που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα των παραγόμενων προγραμμάτων, καθώς και στην εξερεύνηση νέων μετασχηματισμών προγραμμάτων. Ο LHC είναι μια νέα παράλληλη έκδοση του Jhc.
  • Ο nhc98 είναι άλλος ένας μεταγλωττιστής φορητού κώδικα byte αλλά ο κώδικάς του εκτελείται πολύ γρηγορότερα από αυτόν του Hugs. Ο Nhc98 στοχεύει στην ελαχιστοποίηση της χρήσης της μνήμης και είναι πολύ καλή λύση για παλαιότερα και λιγότερο ισχυρά μηχανήματα.
  • Ο Yhc, ή York Haskell Compiler είναι μια παράλληλη έκδοση του nhc98, με στόχο να είναι πιο απλός, πιο φορητός και πιο αποδοτικός, περιλαμβάνοντας υποστήριξη για τον Hat, τον tracer της Haskell. Έχει επίσης ένα πίσω μέρος για JavaScript ώστε οι χρήστες να μπορούν να εκτελούν τα προγράμματα σε Haskell στο φυλλομετρητή τους.

Πλατφόρμα της Haskell[Επεξεργασία | επεξεργασία κώδικα]

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

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

Εφαρμογές[Επεξεργασία | επεξεργασία κώδικα]

Η Haskell χρησιμοποιείται όλο και πιο πολύ σε εμπορικές εφαρμογές[17]. Ο Pugs του Audrey Tang είναι μια υλοποίηση της επερχόμενης γλώσσας Perl 6 με ένα διερμηνέα και μεταγλωττιστές που ήταν έτοιμοι για χρήση μερικούς μήνες μετά τη συγγραφή τους, όμοια ο GHC συχνά χρησιμοποιείται σαν δοκιμαστική πλατφόρμα για προχωρημένα χαρακτηριστικά συναρτησιακού προγραμματισμού και βελτιώσεων. Το Darcs είναι ένα σύστημα διαχείρισης εκδόσεων σε Haskell, με αρκετά πρωτοποριακά χαρακτηριστικά. Η διανομή GNU/Linux Linspire επέλεξε τη Haskell για την ανάπτυξη των εργαλείων συστήματος[18]. Ο 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:
    • Από το Πανεπιστήμιο της Γλασκώβης[19]. Υποστηρίζει συστάδες (clusters) μηχανημάτων ή πολυεπεξεργαστές[20]. Επίσης η Haskell περιλαμβάνει υποστήριξη για παραλληλισμό συμμετρικών πολυεπεξεργαστών (Symmetric Multiprocessor parallelism)[21].
    • Από το MIT[22].
  • 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, συζήτησαν κάποια προβλήματα που προκύπτουν από την οκνηρή αποτίμηση, αναγνωρίζοντας παράλληλα τη θεωρητική ανάγκη για την ύπαρξή της[23][24], και για πρακτικά θέματα όπως η βελτιωμένη απόδοση[25]. Σημειώνουν ότι η οκνηρή αποτίμηση προσθέτει κάποια επιβάρυνση στην απόδοση του προγράμματος και δυσκολεύει τους προγραμματιστές στην κατανόηση της αποδοτικότητας του κώδικά τους (ειδικά όσον αφορά τη χρήση του χώρου στη μνήμη).

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

Συνέδρια (conferences) και workshops[Επεξεργασία | επεξεργασία κώδικα]

Η κοινότητα της Haskell έχει συχνές συναντήσεις για ζητήματα έρευνας και ανάπτυξης. Οι πιο συχνές είναι:

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

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

Δείτε επίσης[Επεξεργασία | επεξεργασία κώδικα]

Παραπομπές[Επεξεργασία | επεξεργασία κώδικα]

  1. http://www.haskell.org/pipermail/haskell-cafe/2008-January/038756.html
  2. http://www.haskell.org/pipermail/haskell-cafe/2008-January/038758.html
  3. Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
  4. Curry, Haskell (1934), «Functionality in Combinatory Logic», Proceedings of the National Academy of Sciences, 20, σελ. 584–590 
  5. Curry, Haskell B.; Feys, Robert (1958), Combinatory Logic Vol. I, Amsterdam: North-Holland , with 2 sections by William Craig, βλ. παράγραφο 9E
  6. De Bruijn, Nicolaas (1968), Automath, a language for mathematics, Department of Mathematics, Eindhoven University of Technology, TH-report 68-WSK-05. Αναθεωρημένη επανεκτύπωση, με δύο σελίδες σχόλια, στο: Automation and Reasoning, vol 2, Classical papers on computational logic 1967-1970, Springer Verlag, 1983, pp. 159-200.
  7. Howard, William A. (1980), «The formulae-as-types notion of construction», Seldin, Jonathan P.; Hindley, J. Roger, To H.B. Curry: Essays on Combinatory Logic, Lambda Calculus and Formalism, Boston, MA: Academic Press, σελ. 479–490, ISBN 978-0-12-349050-6 .
  8. 8,0 8,1 8,2 «Haskell 98 Language and Libraries: The Revised Report». December 2002. http://haskell.org/onlinereport/index.html. 
  9. «The History of Haskell». http://www.haskell.org/haskell-history.html. 
  10. 10,0 10,1 Simon Peyton Jones (editor) (December 2002). «Haskell 98 Language and Libraries: The Revised Report». http://haskell.org/onlinereport/. 
  11. «Welcome to Haskell'». The Haskell' Wiki. http://hackage.haskell.org/trac/haskell-prime. 
  12. Simon Marlow, Tue Nov 24 05:50:49 EST 2009: "[Haskell] Announcing Haskell 2010"
  13. How to make ad-hoc polymorphism less ad hoc P. Wadler, S. Blott, Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, 1989, ACM
  14. Fun with Functional Dependencies, or Types as Values in Static Computations in Haskell T. Hallgren, Proceedings of the Joint CS/CE Winter Meeting, Varberg, Sweden, January 2001,
  15. 15,0 15,1 http://hackage.haskell.org/cgi-bin/hackage-scripts/stats
  16. Computer Language Benchmarks Game
  17. Βλ. Industrial Haskell Group για συνεργατική ανάπτυξη λογσμικού, Commercial Users of Functional Programming για συγκεκριμένα εγχειρήματα και Haskell in industry για μια λίστα εταιρειών που χρησιμοποιούν τη Haskell για εμπορικούς σκοπούς
  18. «Linspire/Freespire Core OS Team and Haskell». Debian Haskell mailing list. May 2006. http://urchin.earth.li/pipermail/debian-haskell/2006-May/000169.html. 
  19. Glasgow Parallel Haskell
  20. GHC Language Features: Parallel Haskell
  21. Using GHC: Using SML parallelism
  22. MIT Parallel Haskell
  23. Jan-Willem Maessen. Eager Haskell: Resource-bounded execution yields efficient iteration. Proceedings of the 2002 ACM SIGPLAN workshop on Haskell.
  24. Simon Peyton Jones. Wearing the hair shirt: a retrospective on Haskell. Invited talk at POPL 2003.
  25. Lazy evaluation can lead to excellent performance, such as in The Computer Language Benchmarks Game [1]
  26. "The subtle syntax and sophisticated type system of Haskell are a double edged sword — highly appreciated by experienced programmers but also a source of frustration among beginners, since the generality of Haskell often leads to cryptic error messages.", Bastiaan Heeren, Daan Leijen, Arjan van IJzendoorn. Helium, for learning Haskell. Proceedings of the 2003 ACM SIGPLAN workshop on Haskell.

Εξωτερικοί σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]

Wikibooks logo
Τα αγγλικά Βικιβιβλία έχουν βιβλία που έχουν σχέση με τη:

Εισαγωγικά κείμενα[Επεξεργασία | επεξεργασία κώδικα]

Στο λήμμα αυτό έχει ενσωματωθεί κείμενο από το λήμμα Haskell_(programming_language) της Αγγλικής Βικιπαίδειας, η οποία διανέμεται υπό την GNU FDL και την CC-BY-SA 3.0. (ιστορικό/συντάκτες).