如何正确地对该 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)
}
}
在尝试编译上述代码时,我收到以下编译器错误:
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
我在这里做错了什么?对上述 HList
进行类型注释的正确方法是什么?
PS:当我删除类型注释时,代码可以正常编译。
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)
}
}
On trying to compile the above code, I get the following compiler error:
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
What am I doing wrong here? What would be the correct way to type-annotate the above HList
?
PS: The code compiles fine when I remove the type annotation.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这里的根本问题是单例类型永远不会被推断。这是一个演示:
这是为什么?奥德斯基等人。等人。 Scala 编程,§27.6:
因此,让我们明确提供类型参数:
额外链接:
The root problem here is that singleton types are never inferred. Here's a demonstration:
Why is this? Quoth Odersky et. al. in Programming in Scala, §27.6:
So, let's explicitly provide the type argument:
Bonus Link:
我不知道为什么,但如果 HNil 被定义为一个类,那么一切都会编译:
I'm not sure why, but if HNil is defined as a class everything compiles: