Υλοποίησε βασικές πράξεις σε λίστες.
Στις συναρτησιακές γλώσσες, οι πράξεις σε λίστες όπως οι length, map και reduce είναι πολύ συνηθισμένες. Υλοποίησε μια σειρά από βασικές πράξεις σε λίστες, χωρίς να χρησιμοποιήσεις υπάρχουσες συναρτήσεις.
Ο ακριβής αριθμός και τα ονόματα των πράξεων που θα υλοποιήσεις εξαρτώνται από τη διαδρομή, ώστε να αποφευχθούν συγκρούσεις με υπάρχοντα ονόματα, αλλά οι γενικές πράξεις που θα υλοποιήσεις περιλαμβάνουν:
append (με δεδομένες δύο λίστες, πρόσθεσε όλα τα στοιχεία της δεύτερης λίστας στο τέλος της πρώτης);concatenate (με δεδομένη μια σειρά από λίστες, συνένωσε όλα τα στοιχεία όλων των λιστών σε μία επίπεδη λίστα);filter (με δεδομένο ένα κατηγόρημα και μια λίστα, επίστρεψε τη λίστα με όλα τα στοιχεία για τα οποία το predicate(item) είναι αληθές);length (με δεδομένη μια λίστα, επίστρεψε τον συνολικό αριθμό των στοιχείων της);map (με δεδομένη μια συνάρτηση και μια λίστα, επίστρεψε τη λίστα με τα αποτελέσματα της εφαρμογής της function(item) σε όλα τα στοιχεία);foldl (με δεδομένη μια συνάρτηση, μια λίστα και έναν αρχικό συσσωρευτή, δίπλωσε (ανάγωγε) κάθε στοιχείο στον συσσωρευτή από τα αριστερά);foldr (με δεδομένη μια συνάρτηση, μια λίστα και έναν αρχικό συσσωρευτή, δίπλωσε (ανάγωγε) κάθε στοιχείο στον συσσωρευτή από τα δεξιά);reverse (με δεδομένη μια λίστα, επίστρεψε μια λίστα με όλα τα αρχικά στοιχεία, αλλά σε αντίστροφη σειρά).Σημείωσε ότι η σειρά με την οποία περνιούνται τα ορίσματα στις συναρτήσεις δίπλωσης (foldl, foldr) έχει σημασία.
Το να υλοποιήσεις αυτές τις πράξεις σε λίστες χωρίς να χρησιμοποιήσεις καμία ενσωματωμένη συνάρτηση είναι πρακτικά αδύνατο στη Roc, γιατί χρειάζεσαι έναν τρόπο να προσθέτεις στοιχεία στο τέλος ή στην αρχή μιας λίστας.
Σε άλλες γλώσσες μπορεί να χρησιμοποιείς τελεστές όπως : στη Haskell ή += στην Python, αλλά στη Roc πρέπει να χρησιμοποιήσεις τις συναρτήσεις της List.
Έτσι, για αυτή την άσκηση σου επιτρέπεται να χρησιμοποιήσεις τη List.append (αλλά απόφυγε να χρησιμοποιήσεις οποιαδήποτε άλλη ενσωματωμένη συνάρτηση).
Πολλές γλώσσες συναρτησιακού προγραμματισμού χρησιμοποιούν συνδεδεμένες λίστες ως τον κύριο τύπο συλλογής.
Είναι αποδοτικό να προσθέσεις ένα στοιχείο στην αρχή μιας συνδεδεμένης λίστας ή να αφαιρέσεις το πρώτο της στοιχείο, οπότε σε αυτές τις γλώσσες θα υλοποιούσες τις πράξεις σε λίστες χρησιμοποιώντας τη List.prepend.
Στη Roc όμως, μια List είναι ένας πίνακας (ένα συνεχόμενο κομμάτι από bytes).
Οι πίνακες έχουν διαφορετικές ιδιότητες από τις συνδεδεμένες λίστες, όπως τη δυνατότητα να προσπελαύνεις αποδοτικά στοιχεία με βάση τη θέση τους και να προσθέτεις νέα στοιχεία στο τέλος.
Για αυτόν τον λόγο, στη Roc χρησιμοποιούμε συχνά τη List.append και σπάνια τη List.prepend.
Η Roc χρησιμοποιεί ελαφρώς διαφορετικά ονόματα από αυτά που αναφέρονται στις γενικές οδηγίες:
concat αντί για append
join αντί για concatenate
len αντί για length
fold αντί για foldl
fold_rev αντί για foldr
Ωστόσο, τα παρακάτω ονόματα συναρτήσεων είναι στάνταρ στη Roc:
filtermapreverseΔοκίμασε να χρησιμοποιήσεις:
match list {
[] => ...
[first, .. as rest] => ...
}
ή
match list {
[] => ...
[.. as rest, last] => ...
}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Roc με 120 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.
Απόλαυσε μια πρακτική εισαγωγή στην αναδρομή, εξερεύνησε τις προστακτικές και τις συναρτησιακές εναλλακτικές στις Λειτουργίες λίστας και ρίξε μια βαθύτερη ματιά στην αναδρομή ουράς και στις συναρτήσεις συσσωρευτή.