Οι κατανοήσεις προσφέρουν έναν τρόπο να μετασχηματίζεις απαριθμήσιμα με ευκολία και δηλωτικά.
Για να δηλώσεις μια πολύ απλή κατανόηση, μπορούμε να χρησιμοποιήσουμε τη λέξη-κλειδί for ακολουθούμενη από μια γεννήτρια και ένα μπλοκ do, που δημιουργεί τις νέες τιμές από τις απαριθμημένες τιμές.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
Οι κατανοήσεις μπορούν επίσης να έχουν φίλτρα. Όσες τιμές δεν περνούν το φίλτρο αφαιρούνται από την τελική λίστα:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
Μπορούμε να δηλώσουμε πιο σύνθετες κατανοήσεις σε πολλές γραμμές:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
Ένα καρτεσιανό γινόμενο μπορεί να δημιουργηθεί με πολλαπλές γεννήτριες. Αυτό σημαίνει ότι κάθε τιμή που παράγει η πρώτη γεννήτρια θα ζευγαρώσει μία φορά με κάθε τιμή που παράγει η δεύτερη γεννήτρια:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Η δουλειά σου στο ηλεκτρονικό κατάστημα μόδας συνεχίζεται. Σου έρχεται η ιδέα για μια δυνατότητα της ιστοσελίδας, όπου προτείνεται ένα σύνολο ρούχων στον χρήστη. Ενώ θέλεις να δίνεις πολλές προτάσεις, δεν θέλεις να δίνεις κακές προτάσεις, οπότε αποφασίζεις να χρησιμοποιήσεις μια κατανόηση λίστας, καθώς μπορείς εύκολα να δημιουργήσεις συνδυασμούς ρούχων και μετά να τους φιλτράρεις με κάποια κριτήρια.
Τα είδη ένδυσης αποθηκεύονται ως χάρτης:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Υλοποίησε τη get_combinations/3 ώστε να δέχεται μια λίστα με πάνω ρούχα, μια λίστα με κάτω ρούχα και μια λίστα λέξεων-κλειδιών με επιλογές. Για την ώρα, κάνε τις επιλογές να έχουν ως προεπιλογή μια κενή λίστα λέξεων-κλειδιών. Η συνάρτηση θα πρέπει να επιστρέφει το καρτεσιανό γινόμενο των λιστών.
tops = [
%{item_name: "Dress shirt"},
%{item_name: "Casual shirt"}
]
bottoms = [
%{item_name: "Jeans"},
%{item_name: "Dress trousers"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Dress shirt"}, %{item_name: "Dress trousers"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Dress trousers"}}
# ]
Κάθε ρούχο έχει ένα πεδίο :base_color. Χρησιμοποίησε αυτό το πεδίο για να φιλτράρεις όλους τους συνδυασμούς όπου το πάνω και το κάτω ρούχο έχουν το ίδιο βασικό χρώμα.
tops = [
%{item_name: "Dress shirt", base_color: "blue"},
%{item_name: "Casual shirt", base_color: "black"}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue"},
%{item_name: "Dress trousers", base_color: "black"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt", base_color: "blue"},
# %{item_name: "Dress trousers", base_color: "black"}},
# {%{item_name: "Casual shirt", base_color: "black"},
# %{item_name: "Jeans", base_color: "blue"}}
# ]
Κάθε ρούχο έχει συνδεδεμένο ένα πεδίο :price. Ενώ θέλεις να δίνεις πολλές προτάσεις, θέλεις να μπορείς να δίνεις στους χρήστες τη δυνατότητα να επιλέξουν μια τιμή που ταιριάζει στον προϋπολογισμό τους. Από τη λίστα λέξεων-κλειδιών με τις επιλογές, χρησιμοποίησε το :maximum_price για να φιλτράρεις τους συνδυασμούς όπου η τιμή του πάνω και του κάτω ρούχου ξεπερνά τη μέγιστη τιμή.
Αν δεν έχει οριστεί κάποιο maximum_price, η προεπιλεγμένη τιμή θα πρέπει να είναι 100.00
tops = [
%{item_name: "Dress shirt", base_color: "blue", price: 35},
%{item_name: "Casual shirt", base_color: "black", price: 20}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue", price: 30},
%{item_name: "Dress trousers", base_color: "black", price: 75}
]
BoutiqueSuggestions.get_combinations(tops, bottoms, maximum_price: 50)
# => [
# {%{item_name: "Casual shirt", base_color: "black", price: 20},
# %{item_name: "Jeans", base_color: "blue", price: 30}}
# ]
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.