use
Στη Gleam είναι συνηθισμένο να γράφεις και να χρησιμοποιείς συναρτήσεις ανώτερης τάξης, δηλαδή συναρτήσεις που παίρνουν άλλες συναρτήσεις ως ορίσματα. Μερικές φορές, όταν χρησιμοποιείς πολλές συναρτήσεις ανώτερης τάξης ταυτόχρονα, ο κώδικας μπορεί να γίνει δυσανάγνωστος, με πολλά επίπεδα εσοχής.
Για παράδειγμα, ορίστε μια συνάρτηση που καλεί αρκετές συναρτήσεις οι οποίες επιστρέφουν Result(Int, Nil), και αθροίζει τις τιμές αν και οι τέσσερις είναι επιτυχείς.
import gleam/result
pub fn main() -> Result(Int, Nil) {
result.try(function1(), fn(a) {
result.try(function2(), fn(b) {
result.try(function3(), fn(c) {
result.try(function4(), fn(d) {
Ok(a + b + c + d)
})
})
})
})
}
Οι εκφράσεις use της Gleam μάς επιτρέπουν να γράψουμε αυτόν τον κώδικα χωρίς την εσοχή, κάνοντάς τον συχνά πιο ευανάγνωστο.
import gleam/result
pub fn main() -> Result(Int, Nil) {
use a <- result.try(function1())
use b <- result.try(function2())
use c <- result.try(function3())
use d <- result.try(function4())
Ok(a + b + c + d)
}
Μια έκφραση use συλλέγει όλες τις επόμενες εντολές του μπλοκ και τις περνά ως συνάρτηση callback, ως τελευταίο όρισμα, στην κλήση της συνάρτησης. Οι μεταβλητές ανάμεσα στη λέξη-κλειδί use και το σύμβολο <- είναι τα ονόματα των ορισμάτων που θα περαστούν στη συνάρτηση callback.
// This use expression
use a <- function(1, 2)
io.println("Hello!")
a
// Is equivalent to this normal function call
function(1, 2, fn(a) {
io.println("Hello!")
a
})
Η συνάρτηση callback μπορεί να πάρει οποιονδήποτε αριθμό ορισμάτων, ή και κανένα.
use a, b, c, d <- call_4_function()
use <- call_0_function()
Δεν υπάρχουν ειδικές απαιτήσεις για να δημιουργήσεις μια συνάρτηση που μπορεί να κληθεί με μια έκφραση use, πέρα από το να παίρνει μια συνάρτηση callback ως τελευταίο όρισμα.
pub fn call_twice(function: fn() -> t) -> #(t, t) {
let first = function()
let second = function()
#(first, second)
}
Οι εκφράσεις use της Gleam είναι ένα πολύ ισχυρό χαρακτηριστικό που μπορεί να εφαρμοστεί σε πολλά προβλήματα, αλλά όταν τις χρησιμοποιείς υπερβολικά μπορούν να κάνουν τον κώδικα δυσανάγνωστο. Γενικά προτιμάται να χρησιμοποιείς τη συνηθισμένη σύνταξη κλήσης συνάρτησης και να καταφεύγεις σε εκφράσεις use μόνο όταν κάνουν τον κώδικα πιο ευανάγνωστο.
Η Daphne δούλευε πάνω σε ένα σύστημα για να εκτελεί και να καταγράφει τα αποτελέσματα των πειραμάτων της. Κάποιο κομμάτι του κώδικα έχει γίνει λίγο φλύαρο και επαναληπτικό, οπότε σου ζήτησε να γράψεις μερικές εκφράσεις use για να τον καθαρίσεις.
with_retry
Μερικές φορές τα πειράματα μπορεί να αποτύχουν εξαιτίας ενός μεμονωμένου λάθους, οπότε αν ένα πείραμα αποτύχει, η Daphne θέλει να το δοκιμάσει ξανά για να δει αν δουλέψει τη δεύτερη φορά.
Όρισε τη συνάρτηση with_retry, η οποία παίρνει ως όρισμα μια συνάρτηση που επιστρέφει ένα αποτέλεσμα.
Αν η συνάρτηση επιστρέψει μια τιμή Ok, τότε η with_retry πρέπει να επιστρέψει αυτή την τιμή.
Αν η συνάρτηση επιστρέψει μια τιμή Error, τότε η with_retry πρέπει να καλέσει ξανά τη συνάρτηση και να επιστρέψει το αποτέλεσμα αυτής της κλήσης.
Η Daphne θα χρησιμοποιήσει τη συνάρτηση ως εξής:
pub fn main() {
use <- with_retry
// Perform the experiment here
}
record_timing
Η Daphne καταγράφει πόσο χρόνο χρειάζεται κάθε πείραμα για να εκτελεστεί, καλώντας μια συνάρτηση καταγραφής χρόνου πριν και μετά από κάθε πείραμα.
Όρισε τη συνάρτηση record_timing, η οποία παίρνει δύο ορίσματα:
Nil.Η record_timing πρέπει να καλέσει τη συνάρτηση καταγραφής χρόνου, μετά να καλέσει τη συνάρτηση πειράματος, έπειτα να καλέσει ξανά τη συνάρτηση καταγραφής χρόνου και τέλος να επιστρέψει το αποτέλεσμα της συνάρτησης πειράματος.
Η Daphne θα χρησιμοποιήσει τη συνάρτηση ως εξής:
pub fn main() {
use <- record_timing(time_logger)
// Perform the experiment here
}
run_experiment
Τα πειράματα αποτελούνται από τρεις φάσεις. Την προετοιμασία, τη δράση και την καταγραφή. Και οι τρεις φάσεις επιστρέφουν αποτελέσματα και κάθε φάση χρειάζεται το επιτυχημένο αποτέλεσμα της προηγούμενης φάσης για να εκτελεστεί.
Όρισε τη συνάρτηση run_experiment, η οποία παίρνει τέσσερα ορίσματα:
String.Ok της συνάρτησης προετοιμασίας και επιστρέφει ένα αποτέλεσμα.Ok των συναρτήσεων προετοιμασίας και δράσης και επιστρέφει ένα αποτέλεσμα.Αν και οι τρεις συναρτήσεις πετύχουν, τότε η run_experiment πρέπει να επιστρέψει Ok(#(experiment_name, recording_data)).
Αν οποιαδήποτε από τις συναρτήσεις επιστρέψει μια τιμή Error, τότε η run_experiment πρέπει να επιστρέψει αυτή την τιμή.
Η Daphne θα χρησιμοποιήσει τη συνάρτηση ως εξής:
pub fn main() {
use setup_data, action_data <- run_experiment("Test 1", setup, action)
// Record the results here
}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.