mis*_*tor 4 scala scala-2.8 hlist
sealed abstract trait HList
case class :+:[H, T <: HList](head: H, tail: T) extends HList {
def :+:[T](v: T) = new :+:(v, this)
}
case object HNil extends HList {
def :+:[T](v: T) = new :+:(v, this)
}
object HListExpt {
def main(args: Array[String]) {
val me: String :+: Int :+: Symbol :+: HNil.type = "Rahul" :+: 20 :+: 'Male :+: HNil
println(me.head, me.tail.head)
}
}
Run Code Online (Sandbox Code Playgroud)
在尝试编译上面的代码时,我得到以下编译器错误:
error: type mismatch;
found : :+:[java.lang.String,:+:[Int,:+:[Symbol,object HNil]]]
required: :+:[String,:+:[Int,:+:[Symbol,HNil.type]]]
val me: String :+: Int :+: Symbol :+: HNil.type = "Rahul" :+: 20 :+: 'Male :+: HNil
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?键入以上内容的正确方法是HList什么?
PS:当我删除类型注释时,代码编译得很好.
这里的根本问题是从不推断单例类型.这是一个演示:
scala> case object A
defined module A
scala> A
res6: A.type = A
scala> identity[A.type](A)
res7: A.type = A
scala> identity(A)
res8: object A = A
Run Code Online (Sandbox Code Playgroud)
为什么是这样?Quoth Odersky et.人.在Scala编程中,§27.6:
通常[singleton]类型太具体而无法使用,这就是编译器不愿意自动插入它们的原因.
所以,让我们明确提供类型参数:
sealed abstract trait HList
case class :+:[H, T <: HList](head: H, tail: T) extends HList {
def :+:[T](v: T) = new :+:(v, this)
}
case object HNil extends HList {
def :+:[T](v: T) = new :+:[T, HNil.type](v, this)
}
val me: String :+: Int :+: Symbol :+: HNil.type = "Rahul" :+: 20 :+: 'Male :+: HNil
println(me.head, me.tail.head)
Run Code Online (Sandbox Code Playgroud)
奖励链接: