..


Σύνδεσμοι διαφημιζόμενων

Συναρτησιακός Προγραμματισμός σε Ruby

Το άρθρο γράφτηκε από Alessio Saltarini
Σελίδα 1 από 2

Εισαγωγή

Λειτουργικό προγραμματισμού (ΠΠ) είναι μια εναλλακτική λύση παράδειγμα προγραμματισμού να εφεύρει το παραδοσιακό (διαρθρωτικά ή επιτακτική ανάγκη προγραμματισμού και αντικειμενοστρεφούς προγραμματισμού), όπως το «λάμδα λογισμός» από Alonso Εκκλησία σε 30 χρόνια, πολύ πριν ήταν γνωστό ότι ακριβώς αυτό που ήταν έναν υπολογιστή.

Μελέτες της Εκκλησίας αποτέλεσε τη βάση για την ανάπτυξη της γλώσσας προγραμματισμού Lisp, και στη συνέχεια ήταν σχεδόν εγκαταλείψει τελείως, όπως ισχυρίστηκαν η επιτακτική ανάγκη προγραμματισμού των υπολογιστών που δημιούργησε το Basic και το Pascal, C, και σήμερα το σύγχρονο C + + και Java.

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

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

Αυτό σημαίνει ότι, ενώ ένα παραδοσιακό πρόγραμμα, γραμμένο σε μια επιτακτική παράδειγμα ή αντικείμενα, αποτελείται από μια σειρά εντολών που ενεργεί για τη μεταβλητή της οποίας η αξία αντιπροσωπεύει την "κατάσταση" του προγράμματος, το λειτουργικό προγραμματισμό της ίδιας της έννοιας της μεταβλητής δεν υπάρχει (Δεν υπάρχει η έννοια του «κράτους») και η εκτέλεση έχει ανατεθεί σε μια σειρά από λειτουργίες που λειτουργούν σε συνεχή λειτουργία.

Το ενδιαφέρον για την λειτουργική γλώσσα έχει χάσει την πάροδο του χρόνου για πολλούς λόγους, κυρίως η δυσκολία μάθησης (συνήθως ένας άνθρωπος σκέφτεται αντικειμένων αντί λειτουργίες, εκτός αν είναι μαθηματικός!) Και της δυσκολίας στην εξεύρεση αποτελεσματική διερμηνείς ή μεταγλωττιστές.

Ruby και FP

Σήμερα, αυτό το ενδιαφέρον έχει ξυπνήσει, ωστόσο, επειδή λειτουργικό προγραμματισμό φέρνει μαζί της μια συνέπεια της πολύ πολύτιμο: δεν μπορεί να με οδηγήσει ορισμού σε σφάλματα κατά το χρόνο εκτέλεσης. Με άλλα λόγια, κατά τη μεταγλώττιση ή την πρώτη φορά, είτε δουλεύει είτε δεν λειτουργεί. Δεν μπορείτε να συμπεριφέρονται με τρόπους που δεν προβλέπεται εκ των προτέρων (σε ένα λειτουργικό πρόγραμμα, στην πραγματικότητα, δεν υπάρχει η έννοια της εξαίρεσης).

Έτσι γεννήθηκαν και μερικά είναι ακμάζουσα λειτουργικές γλώσσες (περισσότερο ή λιγότερο καθαρό, και με περισσότερη ή λιγότερη στήριξη παραδοσιακών προγραμματισμού), όπως: ML / ocaml , Haskell , F # .

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

Κάθε ένας και χάρτης

Το πρώτο χαρακτηριστικό των γλωσσών που υποστηρίζουν κατά κάποιο τρόπο το ΠΠ, είναι να έχουμε στο πρότυπο iterators βιβλιοθήκη σας λειτουργικό. Για παράδειγμα:






 Στοιχεία $ = [1,2,3,4,5]







 Elementi.map $ {| ELEM | βάζει ELEM} + 1



Οι λειτουργίες "χάρτη" ​​και "κάθε" της Ruby δεν είναι τίποτα περισσότερο από ό, τι εφαρμόζεται FP! Στην πραγματικότητα, υπάρχουν λειτουργίες που έχουν άλλες λειτουργίες ως επιχειρήματα. Στη Ruby, τότε, ότι τα τμήματα αυτά είναι από τα μπλοκ του κώδικα που περικλείεται σε {} ή μεταξύ κάνουμε / τερματισμού ανώνυμες λειτουργίες κατασκευαστεί ειδικά για να είναι τα θέματα των πολλών λειτουργιών.

Οι λειτουργίες αυτές ονομάζονται συναρτήσεις FP υψηλής τάξης, δηλαδή συναρτήσεις που παίρνουν ως πολλές λειτουργίες όπως είσοδο.

Σε συγκεκριμένες πράξεις «χάρτη» ως ένα κλασικό και μαθηματική συνάρτηση μπορεί να διαβαστεί ως εξής: για κάθε στοιχείο της σειράς 1-5, εκτελέστε τη λειτουργία: εκτυπώσετε το επόμενο φυσικό αριθμό.

Αυτό το «χάρτη» ή «συνεργάτες», για κάθε στοιχείο μιας συλλογής (έναν πίνακα του Ruby θα λέγαμε) μια συγκεκριμένη λειτουργία που ορίζεται στο μπλοκ.

Το ίδιο πράγμα θα συμβεί φυσικά με:

 



 $ Elementi.each {...}

 
Κλείσιμο των παρεμβάσεων: Proc και λάμδα

Το κλείσιμο είναι μια έννοια παρόμοια με εκείνη της υψηλής προκειμένου λειτουργία: τη δυνατότητα να καθορίζουν ουσιαστικά μια συνάρτηση των μεταβλητών που ενεργούν για τις συνθήκες διαβίωσης σε ένα πλαίσιο διαφορετικό από αυτό της λειτουργίας (π.χ. καθολικές μεταβλητές ή μεταβλητές των άλλων λειτουργιών).

Στη Ruby, μπορώ να γράψω ένα κλείσιμο χρήση ανώνυμων λειτουργίες που μπορούν να οριστούν με τις λέξεις-κλειδιά Proc.new ή λάμδα.

Εδώ είναι ένα παράδειγμα:






 def πολλαπλασιάζονται (πολλαπλασιαστής)



    



 επιστροφή λάμδα {| ν | ν πολλαπλασιαστή *}







 τέλος









 per3 πολλαπλασιασμός = (3)









 per3.call βάζει (3) # => 9







 βάζει per3.call (per8.call (2)) # => 48



Όχι ακριβώς αυτονόητο σε αυτό το παράδειγμα θα ορίσουμε μια συνάρτηση "πολλαπλασιασμό". Τι είναι τόσο παράξενη αυτή η λειτουργία; Εδώ απλά δεν χρησιμοποιούν καμία μεταβλητή!

Το επιχείρημα δεν είναι μια μεταβλητή πολλαπλασιαστής είναι απλώς ένα σύμβολο κράτησης θέσης για μια σταθερά ή μια άλλη λειτουργία.

Αλλά, σε παραδοσιακό προγραμματισμό, είχα γράψει:






 def πολλαπλασιάζονται (α, β)



    



 επιστροφή α * β







 τέλος









 βάζει τον πολλαπλασιασμό (3.3)



Όπως φαίνεται, όμως, θα καθορίσει μια κλείσιμο χρησιμοποιώντας μια "επιχείρηση" Καλώ per3, η οποία καθορίζει τη συμπεριφορά όλων των πολλαπλασιασμών "x3". Στη συνέχεια, καλώ αυτό το χειριστή τον αριθμό 3. Μπορώ να το αποκαλούν επίσης αναδρομικά! Ή κλήση, αντί για μια σταθερή, σε μια άλλη λειτουργία.

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

Στην ίδια κατηγορία ...
E-Learning
Ruby και Ruby on Rails (Μάθημα) Ruby και Ruby on Rails (Μάθημα)
Δημιουργία λογισμικού και Web εφαρμογές με Ρουμπίνι και RoR. Από 39 €.
Σύνδεσμοι διαφημιζόμενων