Perché non c'è un modo ovvio per completare la coda. Qualsiasi scelta su come farlo si tradurrebbe in una coda non ovvia.
Il trucco è di allungare esplicitamente la tua lista più breve per abbinare la lunghezza del più lungo con i valori che ti aspetti.
Se zip lo facesse per te, non potevi sapere quali valori stava compilando in modo intuitivo. Ha ciclato la lista? Ha ripetuto un valore mempty? Cos'è un valore mempty per il tuo tipo?
Non c'è alcuna implicazione in ciò che zip può usare per intuire il modo in cui la coda verrebbe estesa, quindi l'unica cosa ragionevole da fare è lavorare con i valori disponibili piuttosto che fare in modo che il consumatore non si aspetti.
Ricorda anche che ti stai riferendo a una funzione ben nota molto specifica con una semantica ben nota. Ma ciò non significa che non puoi creare una funzione simile ma leggermente diversa . Solo perché esiste una funzione comune che fa x
, non significa che non puoi decidere per il tuo scopo specifico che vuoi fare x
e y
.
Pur ricordando la ragione per cui questa e molte altre comuni funzioni di stile FP sono comuni, è perché sono semplici e generalizzate, quindi puoi modificare il codice per usarle e ottenere il comportamento che desideri. Ad esempio, in C # potresti solo
IEnumerable<Tuple<T, U>> ZipDefaults(IEnumerable<T> first, IEnumerable<U> second)
{
return first.Count() < second.Count()
? first.Concat(Enumerable.Repeat(default(T), second.Count() - first.Count())).Zip(second)
: first.Zip(second.Concat(Enumerable.Repeat(default(U), first.Count() - second.count())))
}
O altre semplici cose. Gli approcci FP rendono le modifiche così semplici perché puoi riutilizzare i pezzi e avere implementazioni così piccole come sopra che creare le tue versioni modificate delle cose è estremamente semplice.