Я использую бесформенные теги и написал код, подобный этому -типов Scala и компиляция
import shapeless.tag
import [email protected]@
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 [email protected]@
object Typeplay {
trait StringTrait
type MyString = String @@ StringTrait
case class StringClass(mps: MyString)
val stringTag = tag[StringTrait]("test")
val stringClass = StringClass(stringTag)
}
В основном это использование явной переменной для тегов. И этот код компилируется !!
Как это может быть? Почему первая программа не компилируется, а вторая?
Можете ли вы пролить свет на то, что это ограничение. Кроме того, я недоумеваю, как можно отличить значение более чем от 1 типа, как это было сделано в первом предложении. Он работает, но я не понимаю, как это сделать. Я попробовал небольшую программу, чтобы убедиться, что это работает во всех сценариях, и это не так: – Bharadwaj
'scala> def myToString [A] (s: A) = s.toString myToString: [A] (s: A) String scala > myToString [String] [Object] ("hello"): 13: error: метод myToString: (s: String) Строка не принимает параметры типа. myToString [String] [Object] ("hello") ^ scala> myToString [String] ("hello") res1: String = hello' –
Bharadwaj
@Bharadwaj, см. Обновление. – Aivean