Dracon.74 Δημοσ. 30 Μαΐου 2014 Δημοσ. 30 Μαΐου 2014 Ανοίγω αυτό το thread, για να γνωρίσουμε και να συζητήσουμε τα περί του συναρτησιακού προγραμματισμού. Οι περισσότεροι από εσάς που έχετε ασχοληθεί με τον προγραμματισμό, συνήθως δίνετε μία ακολουθία από εντολές οι οποίες θα πρέπει να εκτελεστούνε με μία συγκεκριμένη σειρά. Χρησιμοποιείτε μεταβλητές οι οποίες αποθηκεύουν προσωρινά μια τιμή που πιθανότατα θα αλλάξει κάποια στιγμή. Δημιουργείτε βρόγχους, ώστε να επαναλάβετε ορισμένες εντολές πολλές φορές. Ίσως κατασκευάζετε αντικείμενα, για να δώσετε νέο νόημα στα δεδομένα σας, ακολουθώντας το προγραμματιστικό παράδειγμα του αντικειμενοστρεφούς προγραμματισμού. Υπάρχουν, όμως, κι άλλες μεθόδοι με τις οποίες μπορεί κανείς να προσεγγίσει ένα υπολογιστικό πρόβλημα. Στον συναρτησιακό προγραμματισμό, λοιπόν, αντί για αντικείμενα στο επίκεντρο βρίσκονται οι μαθηματικές συναρτήσεις. Αυτές οι συναρτήσεις εστιάζουν κυρίως στο "τι" θέλουμε να πετύχουμε και όχι στο "πως" θέλουμε να το πετύχουμε. Μία μεγάλη διαφορά που μπορούμε να βρούμε στον συναρτησιακό προγραμματισμό, είναι η απουσία μεταβλητών! Δεν υπάρχει, δηλαδή, μία "κατάσταση" στην οποία βρίσκεται το πρόγραμμα που μπορεί να αλλάξει αργότερα. Υπάρχουν μόνο οι συναρτήσεις, που με την είσοδο των ίδιων παραμέτρων θα πρέπει πάντα να επιστρέφουνε το ίδιο αποτέλεσμα, όσες φορές και να εκτελεστούνε και δεν τροποποιούν τίποτα (οι λεγόμενες "pure" συναρτήσεις). Μπορούμε να δηλώσουμε και σταθερές, όπου στην ουσία έχουμε μια συνάρτηση που δεν δέχεται παραμέτρους και επιστρέφει πάντα την ίδια συγκεκριμένη τιμή. Με την απουσία μεταβλητών παρουσιάζεται ένα μικρό "πρόβλημα" στις δομές επανάληψης, καθώς συνήθως απαιτείται κάποιος μετρητής που θα ορίσει το τέλος της επανάληψης μετά από έναν συγκεκριμένο αριθμό επαναλήψεων. Την λύση έρχεται να μας την προσφέρει η μέθοδος της αναδρομής, όπου τις περισσότερες φορές η συνάρτηση καλεί τον εαυτό της, έως ότου εκπληρωθεί η συνθήκη διακοπής της μεθόδου. Είναι σύνηθες φαινόμενο στον συναρτησιακό προγραμματισμό, οι συναρτήσεις να δέχονται ως παραμέτρους όχι μόνο συγκεκριμένες τιμές, αλλά και συναρτήσεις! Τέτοιου είδους συναρτήσεις ονομάζονται high order functions. Σε άλλες περιπτώσεις, μπορεί μια συνάρτηση να επιστρέψει μια άλλη συνάρτηση, όπου βλέπουμε το φαινόμενο του partial application. Τι προτερήματα μπορούμε να λάβουμε από αυτό το είδος προγραμματισμού? α) Αφού δεν μπορούμε να αλλάξουμε κάποια κατάσταση, σημαίνει ότι το προγραμμά μας δεν έχει "παρενέργειες" (side-effects). Αυτό μας εγγυά λιγότερα σφάλματα στον κώδικα. β) Ως αποτέλεσμα, η αποσφαλμάτωση του προγράμματος γίνεται πιο εύκολη. Επίσης μπορεί να γίνει και απόδειξη ορθότητας, καθώς μιλάμε για μαθηματικές συναρτήσεις. γ) Η διαδικασία της παράλληλης εκτέλεσης γίνεται πολύ πιο εύκολη, επειδή τα προβλήματα βρίσκονται πολλές φορές στον συγχρονισμό της πρόσβασης σε μεταβλητές των οποίων η τιμή μπορεί να αλλάξει. Και δεν έχει σημασία η σειρά με την οποία θα εκτελεστούνε οι συναρτήσεις. ... Να κάνω μερικές, αφελείς ίσως, ερωτήσεις; 1. Ποιά η διαφορά ανάμεσα σε αμιγώς συναρτησιακές γλώσσες (όπως είναι η Haskell) και γλώσσες όπως είναι οι (οικογένειες) Lisp και Prolog; 2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang;
jstark Δημοσ. 31 Μαΐου 2014 Δημοσ. 31 Μαΐου 2014 Και δύο λινκς για κάθε ενδιαφερόμενο: Εισαγωγή στο "functional programming" με τη Scala από τον δημιουργό της. https://www.coursera.org/course/progfun Programming Languages. Το πρώτο τμήμα του μαθήματος ασχολείται με SML και το δεύτερο με Racket (LISP dialect) https://www.coursera.org/course/proglang Τα εχω παρακολουθήσει και τα 2, αξίζουν τον κοπο και τα 2, είτε θα χρησιμοποιήσει καποιος τις γλώσσες είτε όχι. Να κάνω μερικές, αφελείς ίσως, ερωτήσεις; 1. Ποιά η διαφορά ανάμεσα σε αμιγώς συναρτησιακές γλώσσες (όπως είναι η Haskell) και γλώσσες όπως είναι οι (οικογένειες) Lisp και Prolog; 2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang; Για το πρώτο ερώτημα πρέπει να γράψω έκθεση . Για το δεύτερο, έχοντας δει μονο τις Haskell & OCaML, η πρώτη ειναι lazy και pure by default, με οποιοδήποτε side-effect "γράφεται" με συγκεκριμένο τρόπο (βλέπε monads κλπ). H δεύτερη επιτρέπει (ευκολα) και άλλα στυλ προγραμματισμου (πχ imperative) και επίσης δεν ειναι lazy by default. Καλό Σ/Κ.
Dracon.74 Δημοσ. 1 Ιουνίου 2014 Δημοσ. 1 Ιουνίου 2014 Τα εχω παρακολουθήσει και τα 2, αξίζουν τον κοπο και τα 2, είτε θα χρησιμοποιήσει καποιος τις γλώσσες είτε όχι. Για το πρώτο ερώτημα πρέπει να γράψω έκθεση . Κρίμα ... ήλπιζα σε μια συνοπτική περιγραφή Για το δεύτερο, έχοντας δει μονο τις Haskell & OCaML, η πρώτη ειναι lazy και pure by default, με οποιοδήποτε side-effect "γράφεται" με συγκεκριμένο τρόπο (βλέπε monads κλπ). H δεύτερη επιτρέπει (ευκολα) και άλλα στυλ προγραμματισμου (πχ imperative) και επίσης δεν ειναι lazy by default. Αυτά είναι, λίγο-πολύ, γνωστά. Ευχαριστώ πάντως. Καλό Σ/Κ.
brute-force Δημοσ. 7 Ιουλίου 2014 Δημοσ. 7 Ιουλίου 2014 Ξεκίνησα να διαβάζω το Learn You a Haskell for Great Good πριν περίπου ένα χρόνο αλλά life happened και ποτέ δεν το τελείωσα μέχρι σήμερα. Πολύ καλό βιβλίο όσο διάβασα και πολύ χιούμορ ο συγγραφέας, το προτείνω. Επίσης το edX έχει εισαγωγικό e-course πάνω στη γλώσσα που ξεκινάει το ερχόμενο φθινόπωρο για όποιον ενδιαφέρεται. Mια άλλη συναρτησιακή γλώσσα στην οποία ρίχνω κλεφτές ματιές τους τελευταίους μήνες είναι η Site: Elm . Κατάλληλη για web developement και με time-travel debugger επηρεασμένο από την δουλειά του Bret Victor όταν ήταν στην Apple. Δείτε την παρακάτω παρουσίαση του δημιουργού της συγκεκριμένης γλώσσας όπωσδηποτε. http://www.infoq.com/presentations/elm-reactive-programming Θέλω κάποια στιγμή επίσης στο μέλλον να ασχοληθώ με Erlang. Πολλές γλώσσες για να μάθουμε, λίγος διαθέσιμος χρόνος...:/ 2. Yπάρχει κάποια ουσιαστική διαφορά ανάμεσα στις Haskell, OCalm και Erlang; Από τα ελάχιστα που ξέρω και φαντάζομαι ίσως γνωρίζεις και εσύ: Eκτός από αυτά που είπε ο jstark, η Haskell είναι native γλώσσα ενώ η OCalm τρέχει πάνω σε VM. Επίσης η Erlang είναι fault-tolerant και οι μηχανισμοί της για συγχρονισμό παίζουν μπάλα σε άλλο επίπεδο. Ασχολείσαι με Go; Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang; 1
tr3quart1sta Δημοσ. 7 Ιουλίου 2014 Μέλος Δημοσ. 7 Ιουλίου 2014 The introduction to Functional Reactive Programming you've been missing
brute-force Δημοσ. 7 Ιουλίου 2014 Δημοσ. 7 Ιουλίου 2014 The introduction to Functional Reactive Programming you've been missing Site: Επίσης ενδιαφέρον σχόλια σχετικά στο HN
Dracon.74 Δημοσ. 8 Ιουλίου 2014 Δημοσ. 8 Ιουλίου 2014 Ασχολείσαι με Go; Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang; Η Go δεν έχει καμία σχέση με την Erlang (που είναι άλλη ιστορία). Είναι αμιγώς system language -οιονεί "διάδοχος" της C. Μαλίστα, με λίγο αυθαίρετο τρόπο θα μπορούσε να πει κάποιος: Go <--> C Rust <--> C++ Στο Internet θα βρεις πληθώρα από άρθρα, blogs για την παραπάνω αντιστοιχία και όχι μόνο.
brute-force Δημοσ. 8 Ιουλίου 2014 Δημοσ. 8 Ιουλίου 2014 (επεξεργασμένο) Η Go δεν έχει καμία σχέση με την Erlang (που είναι άλλη ιστορία). Είναι αμιγώς system language -οιονεί "διάδοχος" της C. Μαλίστα, με λίγο αυθαίρετο τρόπο θα μπορούσε να πει κάποιος: Go <--> C Rust <--> C++ Στο Internet θα βρεις πληθώρα από άρθρα, blogs για την παραπάνω αντιστοιχία και όχι μόνο. Η ερώτηση μου ήταν: Έχεις διαβάσει ποτέ συγκρίσεις ανάμεσα στα μοντέλα συγχρονισμού των Go και Erlang; Το ότι τα μοντέλα συγχρονισμού τους σηκώνουν σύγκριση, δεν έχει καμία σχέση με το αν έχουν σχέση οι γλώσσες αυτές καθαυτές. Για να στο κάνω πιο λιανά, ρώτησα αν γνωρίζεις τις διαφορές ανάμεσα στο CSP μοντέλο που χρησιμοποιεί η Go για συγχρονισμό με το Actor μοντέλο που χρησιμοποιεί η Erlang. Kαι ο λόγος που σου κάνω αυτή την ερώτηση, ανοίγει συζήτηση συγκεκριμένα για το μοντέλο συγχρονισμού της Erlang. Μιας και παραπάνω ήθελες να μάθεις περισσότερα για τις διαφορές της με όσες άλλες ανέφερες. Πάντως υπάρχει ένα μικρό overlap ανάμεσα στους τομείς χρήσης που στοχεύει η κάθε μια, αλλά αυτό ξεφεύγει από το παρόν θέμα. Όπως ξεφεύγουν και οι αντιστοιχίες που έκανες, που σηκώνουν ολόκληρη διαφορετική συζήτηση. Αν θέλεις να συζητήσουμε περί αυτών, μπορείς να ανοίξεις διαφορετικο θέμα. Επεξ/σία 8 Ιουλίου 2014 από brute-force
Dracon.74 Δημοσ. 11 Ιουλίου 2014 Δημοσ. 11 Ιουλίου 2014 Η ερώτηση μου ήταν: Το ότι τα μοντέλα συγχρονισμού τους σηκώνουν σύγκριση, δεν έχει καμία σχέση με το αν έχουν σχέση οι γλώσσες αυτές καθαυτές. Για να στο κάνω πιο λιανά, ρώτησα αν γνωρίζεις τις διαφορές ανάμεσα στο CSP μοντέλο που χρησιμοποιεί η Go για συγχρονισμό με το Actor μοντέλο που χρησιμοποιεί η Erlang. Kαι ο λόγος που σου κάνω αυτή την ερώτηση, ανοίγει συζήτηση συγκεκριμένα για το μοντέλο συγχρονισμού της Erlang. Μιας και παραπάνω ήθελες να μάθεις περισσότερα για τις διαφορές της με όσες άλλες ανέφερες. Πάντως υπάρχει ένα μικρό overlap ανάμεσα στους τομείς χρήσης που στοχεύει η κάθε μια, αλλά αυτό ξεφεύγει από το παρόν θέμα. Όπως ξεφεύγουν και οι αντιστοιχίες που έκανες, που σηκώνουν ολόκληρη διαφορετική συζήτηση. Αν θέλεις να συζητήσουμε περί αυτών, μπορείς να ανοίξεις διαφορετικο θέμα. Έχεις δίκαιο -με συγχωρείς για την άστοχη παρέμβασή μου.
brute-force Δημοσ. 2 Οκτωβρίου 2014 Δημοσ. 2 Οκτωβρίου 2014 Σήμερα ξεκινάει το μάθημα Programming Languages στο Coursera όπου θα χρηιμοποιηθούν Standard ML, Racket και Ruby ώστε να δειχθούν κάποια προγραμματιστικά concepts. Στα 2/3 του μαθήματος (βάσει και των γλωσσών) θα δωθεί έμφαση στον συναρτησιακό προγραμματισμό και κάτι ενδιαφέρον για το μάθημα, είναι βασισμένο σε αντίστοιχο μάθημα 2ου-3ου έτους του πανεπιστημίου. https://www.coursera.org/course/proglang
gon1332 Δημοσ. 2 Οκτωβρίου 2014 Δημοσ. 2 Οκτωβρίου 2014 Επίσης 14/10 ξεκινά και το μάθημα καθαρά συναρτησιακού προγραμματισμού στο edx. Το μάθημα θα χρησιμοποιήσει κυρίως Haskell.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα