小编cee*_*ubs的帖子

在Scala reduceLeft实现中0.asInstanceOf [B]发生了什么

下面是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对象中的第一个元素覆盖该值.

scala

25
推荐指数
2
解决办法
817
查看次数

查找Shapeless HList的类型类实例

假设我有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我想要的,但我不知道是否有一种方式来获得具有斯卡拉推断HListShow实例,而不是我建起来的手.

scala hlist shapeless

8
推荐指数
1
解决办法
669
查看次数

标签 统计

scala ×2

hlist ×1

shapeless ×1