Διαδρομές
/
Gleam
Gleam
/
Ασκήσεις
/
Πειράματα ειδικών
Πειράματα ειδικών

Πειράματα ειδικών

Άσκηση εκμάθησης

Εισαγωγή

Χρήση των εκφράσεων 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 για να τον καθαρίσεις.

1. Όρισε τη συνάρτηση with_retry

Μερικές φορές τα πειράματα μπορεί να αποτύχουν εξαιτίας ενός μεμονωμένου λάθους, οπότε αν ένα πείραμα αποτύχει, η Daphne θέλει να το δοκιμάσει ξανά για να δει αν δουλέψει τη δεύτερη φορά.

Όρισε τη συνάρτηση with_retry, η οποία παίρνει ως όρισμα μια συνάρτηση που επιστρέφει ένα αποτέλεσμα.

Αν η συνάρτηση επιστρέψει μια τιμή Ok, τότε η with_retry πρέπει να επιστρέψει αυτή την τιμή.

Αν η συνάρτηση επιστρέψει μια τιμή Error, τότε η with_retry πρέπει να καλέσει ξανά τη συνάρτηση και να επιστρέψει το αποτέλεσμα αυτής της κλήσης.

Η Daphne θα χρησιμοποιήσει τη συνάρτηση ως εξής:

pub fn main() {
  use <- with_retry
  // Perform the experiment here
}

2. Όρισε τη συνάρτηση record_timing

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

Όρισε τη συνάρτηση record_timing, η οποία παίρνει δύο ορίσματα:

  • Μια συνάρτηση καταγραφής χρόνου, η οποία δεν παίρνει ορίσματα και επιστρέφει Nil.
  • Μια συνάρτηση πειράματος, η οποία δεν παίρνει ορίσματα και επιστρέφει ένα αποτέλεσμα.

Η record_timing πρέπει να καλέσει τη συνάρτηση καταγραφής χρόνου, μετά να καλέσει τη συνάρτηση πειράματος, έπειτα να καλέσει ξανά τη συνάρτηση καταγραφής χρόνου και τέλος να επιστρέψει το αποτέλεσμα της συνάρτησης πειράματος.

Η Daphne θα χρησιμοποιήσει τη συνάρτηση ως εξής:

pub fn main() {
  use <- record_timing(time_logger)
  // Perform the experiment here
}

3. Όρισε τη συνάρτηση 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
}
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Gleam Exercism

Έτοιμος να ξεκινήσεις την άσκηση Πειράματα ειδικών;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.