为什么在 GenericTraversableTemplate 上声明 flatten 而不是在 TraversableLike 上声明?
TraversableLike.flatMap
的签名如下:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
GenericTraversableTemplate.flatten
的签名是:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
为什么是后一种方法(在我看来与 flatMap< /code> 仅在变压器函数是
隐式
的意义上)不能在 TraversableLike
上定义为:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
是否有某种原因表明情况必须如此?
The signature of TraversableLike.flatMap
is as follows:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
The signature of GenericTraversableTemplate.flatten
is:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
Why is the latter method (which seems to me to differ from flatMap
only in the sense that the transformer function is implicit
) not definable on TraversableLike
as:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
Is there some reason that this must be the case?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为答案就在源代码中:
flatten
的隐式参数实际上应该是A <:< Traversable[B]
(即,GenericTraversableTemplate
的泛型参数本身就是Traversable
的断言)。 (请参阅此邮件列表线程 讨论为什么它目前被注释掉。)我的理解是,这个特征中的所有方法过去都是在集合类的(一些)伴随对象上定义的,因为它们只适用于某些实例化(如果是这样的话)类型参数的正确单词)。这个<:<
构造允许它们成为实例方法。I think the answer lies in the source code:
The implicit parameter to
flatten
should actually beA <:< Traversable[B]
(ie. an assertion that the generic parameter ofGenericTraversableTemplate
is itselfTraversable
). (See this mailing list thread for discussion about why it's currently commented out.) My understanding is that all the methods in this trait used to be defined on (some of) the companion objects of collection classes because they were only applicable for some instantiations (if that's the right word) of type parameters. This<:<
construct allows them to be made instance methods.