Тому що немає очевидного способу завершити хвіст. Будь-який вибір того, як це зробити, призведе до не очевидного хвоста.
Хитрість полягає в тому, щоб явно подовжити свій найкоротший список, щоб він відповідав довжині найдовшого та очікуваним значенням.
Якщо zip зробив це для вас, ви не могли б знати, які значення він заповнює інтуїтивно. Чи циклізував цей список? Чи повторювалося це порожнє значення? Що таке порожнє значення для вашого типу?
Немає жодних наслідків у тому, що робить блискавка, яку можна використати для інтуїції того, як хвостик буде подовжений, тому єдине розумне, що потрібно зробити, - це робота з наявними значеннями, а не складання деяких споживачів, можливо, не очікувати.
Також пам’ятайте, що ви маєте на увазі дуже специфічну добре відому функцію із конкретною добре відомою семантикою. Але це не означає, що ви не можете зробити подібну, але трохи іншу функцію . Тільки тому, що є загальна функція, яка це xробить, не означає, що ви не можете визначитися з вашою заданою метою, яку ви хочете зробити xі y.
Хоча пам’ятайте причину, що ця та багато інших загальних функцій стилю FP є загальними, це тому, що вони прості та узагальнені, щоб ви могли налаштувати свій код, щоб використовувати їх та отримувати потрібну поведінку. Наприклад, у C # ви могли просто
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())))
}
Або інші прості речі. Підходи FP роблять модифікації настільки простими, оскільки ви можете повторно використовувати фрагменти, а також те, щоб виконання було настільки мало, як вище, що створювати власні модифіковані версії речей надзвичайно просто.