Как правильно набирать аннотации в этом HList? - PullRequest
4 голосов
/ 11 октября 2010
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: Код прекрасно компилируется, когда я удаляю аннотацию типа.

Ответы [ 2 ]

7 голосов
/ 12 октября 2010

Основная проблема заключается в том, что синглтон-типы никогда не выводятся. Вот демонстрация:

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 et. и др. в Программировании в Scala, §27.6:

Обычно [синглтон] типы слишком конкретный, чтобы быть полезным, поэтому компилятор не хочет вставлять их автоматически.

Итак, давайте явно предоставим аргумент типа:

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)

Бонусная ссылка:

2 голосов
/ 11 октября 2010

Я не уверен, почему, но если HNil определен как класс, все компилируется:

class HNilClass extends HList {
  def :+:[T](v: T) = new :+:(v, this)
}

object HNil extends HNilClass
...