Я использовал бесформенные теги и написал код, похожий на этот:
import shapeless.tag
import shapeless.tag.@@
object Typeplay {
trait StringTrait
type MyString = String @@ StringTrait
case class StringClass(mps: MyString)
val stringClass = StringClass(tag[StringTrait]("test"))
}
И этот код не будет компилироваться. Компилятор Scala жалуется на последнюю строку кода, говорящую:
[error] found : String("test")
[error] required: shapeless.tag.Tagged[in.bharathwrites.Typeplay.StringTrait] with String
[error] val stringClass = StringClass(tag[StringTrait]("test"))
Я не мог понять, что я делаю не так. Поэтому я внес небольшое изменение в свой код -
import shapeless.tag
import shapeless.tag.@@
object Typeplay {
trait StringTrait
type MyString = String @@ StringTrait
case class StringClass(mps: MyString)
val stringTag = tag[StringTrait]("test")
val stringClass = StringClass(stringTag)
}
Что в основном просто использует явную переменную для тегов. И этот код компилируется!!
Как это может быть? Почему первая программа не компилируется, а вторая компилируется?