因为没有完成尾巴的明显方法。关于如何执行此操作的任何选择都将导致不明显的尾巴。
诀窍是显式加长最短列表,以使最长列表的长度与您期望的值匹配。
如果zip为您做到了,那么您将无法直观地知道它所填的值。它循环了清单吗?它重复了一个愚蠢的价值吗?您的类型的空值是多少?
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方法使修改变得非常容易,因为您可以重复使用各个部分,并且实现的规模如此之小,以至于创建自己的修改后的版本极其简单。