下面是Scala的TraversableOnce特性的reduceLeft方法的来源.读取的行发生了什么var acc: B = 0.asInstanceOf[B]?
对我来说,似乎如果我在一个字符串列表中调用它,例如List("a", "b", "c"),这将导致类似的东西0.asInstanceOf[String].但是,如果我直接尝试,则会在运行时0.asInstanceOf[String]抛出一个ClassCastException.
该行发生了什么,为什么它与0.asInstanceOf[String]在字符串列表中调用时直接调用有什么不同?
def reduceLeft[B >: A](op: (B, A) => B): B = {
if (isEmpty)
throw new UnsupportedOperationException("empty.reduceLeft")
var first = true
var acc: B = 0.asInstanceOf[B]
for (x <- self) {
if (first) {
acc = x
first = false
}
else acc = op(acc, x)
}
acc
}
Run Code Online (Sandbox Code Playgroud)
奖金问题:为什么acc甚至初始化为该值?看起来for循环的第一次迭代中的代码将使用TraversableOnce对象中的第一个元素覆盖该值.
假设我有Show[T]Scalaz中的特征:https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/Show.scala#L9
我也有一个无形的HList,可能看起来像"1" :: 2 :: 3L :: HNil.
有没有办法找到Show每个元素的实例并应用shows这样我最终"1" :: "2" :: "3L" :: HNil?
如果任何元素的类型Show在范围内没有隐式实例,我会想要编译错误.
我认为,如果我建立一个HList对的Show情况下,我应该能够用zipApply得到HList我想要的,但我不知道是否有一种方式来获得具有斯卡拉推断HList的Show实例,而不是我建起来的手.