Προγραμματισμός

14 εξαιρετικοί λόγοι για να χρησιμοποιήσετε το F #

Το F # είναι μια έντονα δακτυλογραφημένη, λειτουργική πρώτη γλώσσα προγραμματισμού που σας επιτρέπει να επιλύσετε πολύπλοκα προβλήματα γράφοντας απλό κώδικα. Με βάση το ML και ενσωματωμένο στο .NET Framework, το F # προσφέρει καλή διαλειτουργικότητα, φορητότητα και ταχύτητα χρόνου εκτέλεσης, καθώς και το "Five Cs" - ευκρίνεια, ευκολία, ορθότητα, συνάφεια και πληρότητα.

Το F # ήταν αρχικά διαθέσιμο μόνο στα Windows, ως έργο Microsoft Research, αλλά τώρα είναι μια γλώσσα πρώτης κατηγορίας σε διάφορες πλατφόρμες. Μπορείτε να χρησιμοποιήσετε το F # σε Mac και Linux με υποστήριξη εργαλείων στο Xamarin Studio, το MonoDevelop, το Emacs και άλλα. σε Windows με Visual Studio, Xamarin Studio και Emacs. και σε συσκευές Android και iOS και στον Ιστό χρησιμοποιώντας HTML5. Εκτός από τον προγραμματισμό γενικού σκοπού, το F # ισχύει για τον κώδικα GPU, τα μεγάλα δεδομένα, τα παιχνίδια και πολλά άλλα.

Γιατί να χρησιμοποιήσετε το F #; Επιτρέψτε μου να σας δώσω 14 λόγους.

Το F # είναι διαδραστικό

Ένα από τα πλεονεκτήματα του F # είναι ότι διαθέτει μια διαδραστική REPL (ανάγνωση, αξιολόγηση, εκτύπωση, βρόχος) όπου μπορείτε να δοκιμάσετε τον κώδικα, όπως φαίνεται στην παρακάτω εικόνα της οθόνης. Δεξιόστροφα, από πάνω αριστερά, βλέπουμε F # διαδραστικά παράθυρα από το Visual Studio στα Windows, από το TryFSharp να εκτελείται στο Chrome και από το Xamarin Studio που εκτελείται σε Mac OS X. ;; λέει στο F # Interactive να αξιολογήσει τι έχετε πληκτρολογήσει. στο TryFSharp το κουμπί "run" στέλνει το ίδιο σήμα. Χρησιμοποιώντας ένα REPL για να μεταγλωττίσετε και να δοκιμάσετε τον κώδικα πριν προχωρήσει σε ένα πλήρες πρόγραμμα επιταχύνει την ανάπτυξη και μειώνει τα σφάλματα.

Το F # είναι για δέσμες ενεργειών

Το F # μπορεί να χρησιμοποιηθεί ως γλώσσα δέσμης ενεργειών καθώς και ως γλώσσα προγραμματισμού. Παρακάτω βλέπουμε ένα δείγμα του Visual Studio στο οποίο ένα σενάριο F # φορτώνει τέσσερα αρχεία προγράμματος F # και ανοίγει δύο βιβλιοθήκες .NET πριν εκτελέσει τον δικό του κώδικα. Η σημειογραφία [|…|] χρησιμοποιείται εδώ δηλώνει έναν πίνακα. Η σημειογραφία |> είναι ένας μπροστινός σωλήνας, ο οποίος περνά το αποτέλεσμα της αριστερής πλευράς στη λειτουργία στη δεξιά πλευρά. Οι νέες γραμμές εδώ δεν είναι συντακτικά σημαντικές. Απλώς κάνουν τον κωδικό ευκολότερο να διαβαστεί από το να έχουν ολόκληρες εκφράσεις σωλήνων σε μία γραμμή.

Το F # είναι λειτουργικό

Το F # υποστηρίζει λειτουργικά δομήματα προγραμματισμού, όπως η αντιμετώπιση συναρτήσεων ως τιμών, η χρήση ανώνυμων συναρτήσεων σε εκφράσεις, η σύνθεση συναρτήσεων για το σχηματισμό νέων συναρτήσεων, οι καμπυλωμένες συναρτήσεις και ο σιωπηρός ορισμός των λειτουργιών μέσω της μερικής εφαρμογής των ορισμάτων των λειτουργιών. Στην επάνω οθόνη που ακολουθεί, ορίζουμε και χρησιμοποιούμε ένα Προσθήκη λειτουργία. Το σώμα της συνάρτησης είναι εσοχή (όπως Python) και οι τύποι ορίσματος συνάγονται ως ακέραιοι λόγω του + χειριστής. Στο κάτω στιγμιότυπο οθόνης, παρέχουμε ένα σχολιασμό τύπου μετά το όνομα του ορίσματος χρησιμοποιώντας άνω και κάτω τελεία και ένα όνομα τύπου, οπότε το F # το γνωρίζει φράση είναι ένα σειρά τύπος.

Το F # είναι συνοπτικό

Ο παρακάτω κώδικας είναι ένας αλγόριθμος τύπου Quicksort που εφαρμόζεται στο F # (από τον Scott Wlaschin). ο rec Η λέξη-κλειδί δείχνει ότι η συνάρτηση είναι αναδρομική. ο αγώνα με η σύνταξη είναι α διακόπτης δήλωση για τα στεροειδή, με | υποδεικνύοντας περιπτώσεις. ο [] υποδεικνύει μια κενή λίστα. ο Πρώτο Έλμ και άλλα στοιχεία δημιουργούνται αυτόματα.

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

ας rec λίστα γρήγορης ταξινόμησης =

λίστα αντιστοιχιών με

| [] -> // Εάν η λίστα είναι κενή

[] // επιστρέψτε μια κενή λίστα

| firstElem :: otherElements -> // Εάν η λίστα δεν είναι κενή

αφήστε μικρότερα στοιχεία = // εξαγάγετε τα μικρότερα

άλλα στοιχεία

|> List.filter (διασκεδαστικό e -> e <firstElem)

|> γρήγορη ταξινόμηση // και ταξινόμηση

αφήστε μεγαλύτερα στοιχεία = // εξαγάγετε τα μεγάλα

άλλα στοιχεία

|> List.filter (διασκεδαστικό e -> e> = firstElem)

|> γρήγορη ταξινόμηση // και ταξινόμηση

// Συνδυάστε τα 3 μέρη σε μια νέα λίστα και επιστρέψτε τα

List.concat [μικρότερα στοιχεία; [firstElem]; μεγαλύτερα στοιχεία]

//δοκιμή

printfn "% A" (γρήγορη ταξινόμηση [1; 5; 23; 18; 9; 1; 3])

Για σύγκριση, ρίξτε μια ματιά στην παραδοσιακή εφαρμογή C # παρακάτω.

δημόσια τάξη QuickSortHelper

{

δημόσια στατική λίστα QuickSort (Τιμές λίστας)

όπου T: IC Συγκρίσιμο

   {

αν (τιμές. Αριθμός == 0)

      {

επιστροφή νέας λίστας ();

      }

// πάρτε το πρώτο στοιχείο

T firstElement = τιμές [0];

// πάρτε τα μικρότερα και μεγαλύτερα στοιχεία

var smallElements = νέα λίστα ();

var largeElements = νέα λίστα ();

για (int i = 1; i <Values.Count; i ++) // i ξεκινά από το 1

{// όχι 0!

var elem = τιμές [i];

εάν (elem.CompareTo (firstElement) <0)

         {

Μικρότερα στοιχεία. Προσθήκη (elem);

         }

αλλού

         {

Μεγαλύτερα στοιχεία. Προσθήκη (elem);

         }

      }

// επιστρέψτε το αποτέλεσμα

var αποτέλεσμα = νέα λίστα ();

αποτέλεσμα.AddRange (QuickSort (smallElements.ToList ()));

αποτέλεσμα. Προσθήκη (firstElement);

αποτέλεσμα.AddRange (QuickSort (largeElements.ToList ()));

αποτέλεσμα επιστροφής;

   }

}

Θα παρατηρήσετε πόσο επιπλέον έχει ο κώδικας C # σε σύγκριση με τον κωδικό F #.

Το F # είναι πραγματικά συνοπτικό

Σύμφωνα με τον Scott Wlaschin, η έκδοση της γρήγορης ταξινόμησης που φαίνεται παρακάτω - και οι τέσσερις γραμμές της - έχει την τυπική συνοπτική εμφάνιση του F # που έχει γραφτεί από έναν έμπειρο λειτουργικό κωδικοποιητή. Φυσικά, θα ήταν ο πρώτος που επεσήμανε ότι δεν ταιριάζει στη θέση του. Μου πήρε πολλές αναγνώσεις για να κατανοήσω τον κώδικα, αλλά άξιζε τον χρόνο.

ας rec quicksort2 = συνάρτηση

   | [] -> []                        

| πρώτο :: υπόλοιπο ->

αφήστε το μικρότερο, μεγαλύτερο = List.partition ((> =) πρώτα) να ξεκουραστεί

List.concat [quicksort2 μικρότερο; [πρώτα]; quicksort2 μεγαλύτερο]

// κωδικός δοκιμής

printfn "% A" (γρήγορη ταξινόμηση2 [1; 5; 23; 18; 9; 1; 3])

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

Το F # μειώνει τα σφάλματα μέσω της έντονης πληκτρολόγησης

Σε αντίθεση με το JavaScript, το Ruby και το Python, το F # είναι έντονα δακτυλογραφημένο και όχι δυναμικά. Σε αντίθεση με τα C και C ++, τα οποία είναι επίσης έντονα δακτυλογραφημένα, αλλά απαιτούν να δηλωθούν όλοι οι τύποι, το F # εκτελεί συμπεράσματα τύπου όποτε είναι δυνατόν. Όταν δεν είναι δυνατή η εξαγωγή τύπου, αλλά ο τύπος πρέπει να είναι γνωστός, ο F # μεταγλωττιστής θα εμφανίσει σφάλμα και θα προτείνει να παρέχετε έναν σχολιασμό τύπου, όπως έπρεπε να κάνουμε σε ένα προηγούμενο παράδειγμα (φράση: string) επιχείρημα προς το στοHackerTalk λειτουργία. Η ανίχνευση αναντιστοιχίας τύπου κατά το χρόνο μεταγλώττισης εξαλείφει μια ολόκληρη κατηγορία σφαλμάτων χρόνου εκτέλεσης στα οποία είναι επιρρεπείς οι δυναμικά πληκτρολογημένες γλώσσες.

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

Το F # διαθέτει ένα μεγάλο, καλά επιλεγμένο σύνολο αντικειμένων, όπως List, String και Array

Όπως μπορείτε να δείτε από το IntelliSense παρακάτω, το F # διαθέτει πλούσιες λειτουργικές μονάδες List, String και Array βάσει του .NET Framework. Από αυτή την άποψη, είναι επίσης μια αντικειμενοστρεφής γλώσσα, παρόλο που είναι πρωτίστως λειτουργική γλώσσα. Παρατηρήστε ότι δεν έχει σημασία αν χρησιμοποιείτε το όνομα της λειτουργικής μονάδας ή το όνομα της μεταβλητής που πληκτρολογείτε - όταν προσθέτετε την τελεία, οι συναρτήσεις μέλους θα εμφανιστούν. Μερικά άτομα υποστηρίζουν ότι η ρητή χρήση του ονόματος της ενότητας είναι καλύτερο στυλ για μια λειτουργική γλώσσα από τις διακεκομμένες μεταβλητές, αλλά δεν αγοράζω εντελώς αυτό το επιχείρημα.

Το F # είναι χρήσιμο για το MapReduce

Το MapReduce είναι μια αποτελεσματική διαδικασία δύο βημάτων που χρησιμοποιείται συχνά σε μεγάλα δεδομένα και υποστηρίζεται ρητά στο Hadoop. Σε αυτό το παράδειγμα F #, χαρτογραφούμε και μειώνουμε μια λίστα ακέραιων αριθμών. Αρχικά φιλτράρουμε τη λίστα στους ζυγούς αριθμούς, μετά διπλασιάζουμε κάθε αριθμό και τέλος παίρνουμε το άθροισμα όλων των στοιχείων στη λίστα για να συγκεντρώσουμε ή να μειώσουμε το αποτέλεσμα. List.map είναι μια ισχυρή λειτουργία υψηλότερης τάξης. μια συνάρτηση υψηλότερης τάξης είναι εκείνη που παίρνει μια άλλη συνάρτηση ως επιχείρημα. Εκτός από τις λίστες και τους πίνακες, το F # υποστηρίζει εγγραφές, ακολουθίες, παροχείς τύπων δεδομένων και LINQ (ερώτημα με ενσωματωμένη γλώσσα).

Το F # έχει εγγραφές

Οι εγγραφές F # αντιπροσωπεύουν απλά συσσωματώματα ονομασμένων τιμών, προαιρετικά με μέλη. Στο παρακάτω παράδειγμα, πρώτα ορίζουμε ένα Βιβλίο τύπος εγγραφής με τέσσερις ονομασμένες τιμές και στη συνέχεια δημιουργούμε μια εγγραφή χρησιμοποιώντας τα ίδια τέσσερα ονόματα. Ο F # compiler εισάγει σωστά το Βιβλίο πληκτρολογήστε ταιριάζοντας τα ονόματα.

Οι εγγραφές F # μπορούν να έχουν προαιρετικές τιμές

Οι εγγραφές δεν πρέπει πάντα να περιλαμβάνουν όλες τις ονομαστικές τιμές τους. Εάν δώσετε μια ονομαστική τιμή το επιλογή όταν ορίζετε τον τύπο, τότε μπορεί να μείνει εκτός εγγραφής. Όταν ορίζετε μια προαιρετική τιμή, μπορεί να είναι είτε Κανένας, που καταλήγει ως μηδενικόή μπορεί να είναι Μερικοί ακολουθούμενη από την τιμή που θέλετε να ορίσετε. Τα πεδία εγγραφής διαφέρουν από τις κλάσεις στο ότι εκτίθενται αυτόματα ως ιδιότητες. Οι τάξεις και οι δομές στο F # είναι τάξεις και δομές .NET, συμβατές με C # και Visual Basic .NET, οπότε θα παραλείψω παραδείγματα.

Το F # έχει ακολουθίες

Μια ακολουθία στο F # είναι μια λογική σειρά στοιχείων όλων των τύπων. Οι ακολουθίες είναι ιδιαίτερα χρήσιμες όταν έχετε μια μεγάλη, ταξινομημένη συλλογή δεδομένων, αλλά δεν περιμένετε απαραίτητα να χρησιμοποιήσετε όλα τα στοιχεία. Τα μεμονωμένα στοιχεία ακολουθίας υπολογίζονται μόνο όπως απαιτείται, επομένως μια ακολουθία μπορεί να προσφέρει καλύτερη απόδοση από μια λίστα σε καταστάσεις στις οποίες δεν χρησιμοποιούνται όλα τα στοιχεία. ο Αρ Η ενότητα παρέχει υποστήριξη για χειρισμούς που περιλαμβάνουν ακολουθίες. Στην παρακάτω εικόνα, παρουσιάζουμε απλές ακολουθίες, ακολουθίες με εκφράσεις και ακολουθίες με φίλτρα.

Το F # υποστηρίζει παρόχους δεδομένων και LINQ

Παρακάτω χρησιμοποιούμε το πρόγραμμα επεξεργασίας TryFSharp για να ανοίξουμε ένα online σύνολο δεδομένων μετεωρολογίας Freebase και να υποβάλουμε ερώτημα στον πάροχο δεδομένων για κυκλώνες που έχουν καταγράψει τις υψηλότερες τιμές ανέμου. ο ερώτημα {} η σύνταξη εφαρμόζει το LINQ για το F #. Η χρήση αυτού του DLL είναι συγκεκριμένη για το TryFSharp. Στο Visual Studio, θα το κάνατε άνοιγμα Microsoft.FSharp.Data.TypeProviders και στη συνέχεια χρησιμοποιήστε την κατάλληλη υπηρεσία παροχής δεδομένων.

Το αποτέλεσμα:

 [Τυφώνας Andrew; Ο τυφώνας Hugo; 1900 τυφώνας Galveston;

Τροπική καταιγίδα Allison; Κυκλώνας Tracy; Τυφώνας Iniki; Τυφώνας Ιβάν;

Ο κυκλώνας Οδησσών 1999; Τυφώνας Κατρίνα; Τυφώνας Ταλιμ; Τυφώνας Ρίτα;

Τυφώνας βότανο; Ο τυφώνας Wilma; Τυφώνας Βέρα; 1962 εποχή του τυφώνα του Ειρηνικού;

Τυφώνας Ike; Τυφώνας Mireille; Τυφώνας Babe; Τροπική καταιγίδα Arlene;

Τυφώνας Ειρήνη; Τυφώνας Zeb; Τυφώνας Μάιμι; Τυφώνας Μπες; Τυφώνας Τσαντσού;

Τυφώνας Patsy; Τυφώνας Ewiniar; Τυφώνας Ioke; Τυφώνας Xangsane;…

Το F # μπορεί να αναλύσει δεδομένα Hadoop

Σε αυτό το παράδειγμα, χρησιμοποιούμε το πρόγραμμα επεξεργασίας TryFsharp για να ανοίξουμε μια παρουσία Hadoop Hive που περιέχει, μεταξύ άλλων συνόλων δεδομένων, μετρήσεις χαρακτηριστικών λουλουδιών ίριδας, καθώς και μονάδες σχολιασμών μέτρησης. Κατά συνέπεια, έχουμε ενεργοποιήσει τη χρήση σχολιασμών μονάδας στις ιδιότητες του HiveTypeProvider.

Αυτός ο υπολογισμός επιστρέφει:

val avgPetalLength: float = 0,0374966443

Το F # ταιριάζει μοτίβο

Το F # αγώνας Η έκφραση παρέχει έλεγχο διακλάδωσης που βασίζεται στη σύγκριση μιας έκφρασης με ένα σύνολο προτύπων. Οι γραμμές 1-7 του παρακάτω παραδείγματος ορίζουν μια αναδρομική είναι το Palindrome λειτουργία. Οι γραμμές 8-10 ορίζουν μια συνάρτηση περιτύλιξης για είναι το Palindrome που την αποκαλεί την πρώτη φορά χρησιμοποιώντας ολόκληρη τη συμβολοσειρά. Επειδή το "aba" είναι ένα περίγραμμα, το έπειτα η ρήτρα της γραμμής 9 ενεργοποιεί και επιστρέφει Μερικά s, και το αγώνας Η δήλωση στη γραμμή 11 δημιουργεί "Το string aba είναι palindrome". ο _ πρότυπο στη γραμμή 14 είναι η προεπιλεγμένη περίπτωση.

ο αγώνα .. | Η δήλωση στο F # έχει πολλά οφέλη έναντι του διακόπτης..κασέτα δήλωση σε C #, C ++ και Java, το πιο σημαντικό από τα οποία είναι ότι προκαλεί λιγότερα σφάλματα.

Το F # υποστηρίζει ασύγχρονες ροές εργασίας

Το F # έχει πρόσβαση σε όλο το .NET Framework, αλλά έχει επίσης τη δική του σύνταξη για ασύγχρονες ροές εργασίας. ο ασύγχρονος {έκφραση} η σύνταξη ορίζει έναν μη αποκλεισμό υπολογισμού. ο κάνω! Η λέξη-κλειδί εκτελεί μια ασύγχρονη λειτουργία και περιμένει το αποτέλεσμα. ο αφήνω! η λέξη-κλειδί περιμένει μια ασύγχρονη λειτουργία και αποδίδει το αποτέλεσμα. Και χρήση! περιμένει μια ασύγχρονη λειτουργία, εκχωρεί το αποτέλεσμα και απελευθερώνει τον πόρο. Async.RunSynchronously εκτελεί μια ασύγχρονη λειτουργία και περιμένει το αποτέλεσμα. Για να προσθέσετε παραλληλισμό, χρησιμοποιήστε το Async.Parallel συνάρτηση, η οποία παίρνει μια λίστα με το Async αντικείμενα, ορίζει τον κωδικό για κάθε ένα Async αντικείμενο εργασίας για εκτέλεση παράλληλα και επιστρέφει ένα Async αντικείμενο που αντιπροσωπεύει τον παράλληλο υπολογισμό. Στη συνέχεια, διοχετεύστε το Async.RunSynchronously. (Το παρακάτω παράδειγμα είναι από F # για διασκέδαση και κέρδος.)

F # πόροι

Για περισσότερες πληροφορίες σχετικά με το F #, ακολουθήστε τους παρακάτω συνδέσμους.

  • Δοκιμάστε το F #
  • F # για διασκέδαση και κέρδος
  • F # Αναφορά γλώσσας
  • Λειτουργικός προγραμματισμός πραγματικού κόσμου
  • F # βιβλία στο Amazon
  • F # 3 Λευκή Βίβλος
  • Πρόσθετες αναφορές