gpt4 book ai didi

scala - 如何正确地对这个 HList 进行类型注释?

转载 作者:行者123 更新时间:2023-12-04 23:09:30 25 4
gpt4 key购买 nike

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:当我删除类型注释时,代码编译得很好。

最佳答案

这里的根本问题是从不推断单例类型。这是一个演示:

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

为什么是这样? Quoth Odersky 等。阿尔。在 Scala 编程中,第 27.6 节:

Usually [singleton] types are too specific to be useful, which is why the compiler is reluctant to insert them automatically.



因此,让我们明确提供类型参数:
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)

奖金链接:
  • Singleton Types are Mean and Spiteful
  • 关于scala - 如何正确地对这个 HList 进行类型注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3907727/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com