Η εξαγωγή συναρτήσεων καλύφθηκε στην πρώτη έννοια, ορίστε μια γρήγορη υπενθύμιση.
Κάθε αρχείο στην Elm είναι μια ενότητα και πρέπει να περιέχει μια εντολή module πριν από όλον τον υπόλοιπο κώδικα.
Τα ονόματα των ενοτήτων πρέπει να ταιριάζουν με το όνομα του αρχείου τους, οπότε η ενότητα Calculator πρέπει να βρίσκεται στο αρχείο Calculator.elm, και η ενότητα Parser.Utils πρέπει να βρίσκεται στο αρχείο Parser/Utils.elm.
Ό,τι ορίζεται μέσα σε μια ενότητα έχει ιδιωτική εμβέλεια και δεν είναι προσβάσιμο έξω από αυτήν, εκτός αν περιλαμβάνεται στο exposing.
-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)
six = 3 + 3
add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)
six = 3 + 3
add number1 number2 = number1 + number2
https://elm-lang.org/docs/syntax#modules
Η πρόσβαση σε συναρτήσεις που ορίζονται σε άλλες ενότητες γίνεται μέσω εισαγωγών. Όλες οι συναρτήσεις μέσα σε αυτή την ενότητα που έχουν εκτεθεί από αυτήν γίνονται προσβάσιμες όταν εισάγεις αυτή την ενότητα. Αλλά ο τρόπος με τον οποίο είναι προσβάσιμες διαφέρει ανάλογα με τον τρόπο που εισάγεται η ενότητα.
Οι προσδιορισμένες εισαγωγές είναι η προεπιλογή, και η πρόσβαση σε μια συνάρτηση μέσα σε μια τέτοια ενότητα (για παράδειγμα τη συνάρτηση map στην ενότητα List) γίνεται βάζοντας ως πρόθεμα το όνομα της ενότητας (List.map).
Οι ανοιχτές εισαγωγές επιτρέπουν άμεση πρόσβαση στις εκτεθειμένες συναρτήσεις μέσα σε αυτή την ενότητα, χωρίς πρόθεμα. Γίνονται με τη λέξη-κλειδί exposing, κατ' αντιστοιχία με αυτήν που χρησιμοποιείται στις εξαγωγές. Μπορείς να εκθέσεις όλες τις διαθέσιμες συναρτήσεις (με ..), ή συγκεκριμένες (για παράδειγμα τη map).
Μπορείς επίσης να εισάγεις τύπους και τους κατασκευαστές τους από άλλες ενότητες, κάτι που θα το δεις σε επόμενη έννοια.
Οι προσδιορισμένες εισαγωγές προτιμώνται για τη σαφήνεια και για την αποφυγή συγκρούσεων ονομάτων.
-- qualified imports
import List -- List.map, List.foldl
import List as L -- L.map, L.foldl
-- open imports
import List exposing (..) -- map, foldl, concat, ...
import List exposing ( map, foldl ) -- map, foldl, List.concat
https://elm-lang.org/docs/syntax#modules
Οι επισημάνσεις τύπων ορίζονται με name : parameter types -> return type, με τους τύπους των παραμέτρων να χωρίζονται επίσης με ->.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
Οι παρενθέσεις μπορούν να χρησιμοποιηθούν για να ορίσουν παραμέτρους συνάρτησης (οι οποίες ορίζονται και οι ίδιες με την ίδια σύνταξη, εξ ου και η ανάγκη για παρενθέσεις).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
Στην Elm υπάρχουν δύο τύποι αριθμών, που ορίζονται από τους τύπους Int και Float.
Ο Int αντιστοιχεί στο σύνολο των θετικών και αρνητικών ακεραίων.
Ο Float αντιστοιχεί στο σύνολο των πραγματικών αριθμών, περιορισμένο από την ακρίβεια του υπολογιστή.
Οι πράξεις που ορίζονται για αριθμούς συνήθως λειτουργούν με τον έναν ή τον άλλο τύπο, αλλά δεν ανακατεύουν τους δύο τύπους.
Υπάρχουν συναρτήσεις για τη μετατροπή μεταξύ των δύο, όπως η toFloat που μετατρέπει Int σε Float, και οι round, floor, ceiling ή truncate που μετατρέπουν ένα Float σε Int με διαφορετική σημασιολογία.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
Για να περιγράψεις λέξεις και προτάσεις στον κώδικα, η Elm έχει έναν ενσωματωμένο τύπο String.
Τα κυριολεκτικά συμβολοσειρών γράφονται μέσα σε διπλά εισαγωγικά, όπως το "Hello World!".
Ένας τελεστής συνένωσης συμβολοσειρών ++ και ένας τελεστής ισότητας == είναι διαθέσιμοι από προεπιλογή.
hello : String -> String
hello subject = "Hello " ++ subject
hello "World!" --> "Hello World!"
Οι περισσότερες άλλες συναρτήσεις συμβολοσειρών βρίσκονται στην ενότητα String, η οποία πρέπει να εισαχθεί.
https://package.elm-lang.org/packages/elm/core/latest/String
Σε αυτή την άσκηση θα γράψεις κώδικα για να βοηθήσεις το Betty's Bike Shop, ένα ηλεκτρονικό κατάστημα για ποδήλατα και ανταλλακτικά. Έχεις τρεις εργασίες, με στόχο να εμφανίζονται σωστά οι τιμές των ποδηλάτων και των ανταλλακτικών στην ιστοσελίδα.
penceToPounds
Ο συνάδελφός σου έχει ήδη γράψει τον σκελετό του module, δηλαδή τις μη ορισμένες συναρτήσεις penceToPounds και poundsToString.
Ωστόσο, ξέχασε να εξάγει τη συνάρτηση penceToPounds, οπότε αυτή τη στιγμή δεν είναι ορατή από άλλα modules ούτε από τη σουίτα δοκιμών.
Πρόσθεσε τη συνάρτηση penceToPounds στη λίστα με τις εξαγόμενες συναρτήσεις.
Αυτή τη στιγμή, η τιμή αποθηκεύεται ως ακέραιος αριθμός πενών (το κατάστημα ποδηλάτων εδρεύει στο Ηνωμένο Βασίλειο).
Στην ιστοσελίδα, θέλουμε να δείχνουμε την τιμή σε λίρες, όπου 1,00 λίρα αντιστοιχεί σε 100 πένες.
Η δεύτερη εργασία σου είναι να υλοποιήσεις τη συνάρτηση penceToPounds, η οποία παίρνει ένα ποσό σε πένες ως Int και το μετατρέπει στο ισοδύναμό του σε λίρες ως Float.
Θα πρέπει επίσης να ορίσεις τη δήλωση τύπου για αυτή τη συνάρτηση.
penceToPounds 106
--> 1.06
Επειδή τα ποδήλατα της Betty πωλούνται σε λίρες, οι τιμές θα πρέπει να εμφανίζονται με το σύμβολο "£".
Η τρίτη εργασία σου είναι λοιπόν να υλοποιήσεις τη συνάρτηση poundsToString, η οποία παίρνει ένα ποσό σε λίρες ως Float και επιστρέφει την τιμή του ως String, με το σύμβολο της λίρας μπροστά.
Το module String περιέχει τη συνάρτηση String.fromFloat, που θα σου φανεί χρήσιμη γι' αυτό.
Θα πρέπει να εισάγεις το module String πριν το χρησιμοποιήσεις.
Θα πρέπει επίσης να ορίσεις τη δήλωση τύπου για τη συνάρτηση poundsToString.
poundsToString 1.06
--> "£1.06"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.