Я играю с бесформенным, чтобы исследовать возможность извлечения типа значения в бесформенной помеченной записи.Мотивация заключается в том, что я могу затем использовать классы типов и имплициты для отправки потока процесса на основе типа.Однако следующий код не работает.
import shapeless._, record._
import shapeless.ops.record.Selector
import shapeless.syntax.RecordOps
import shapeless.syntax.singleton._
object ShapelessRecordTest extends App {
trait Extractor[K, T] {
type OUT_K
def extract: T => OUT_K
}
object Extractor {
type Aux[K, T, OUT_K0] = Extractor[K, T] {
type OUT_K = OUT_K0
}
implicit def apply[T, Repr, OUT](k: Witness)(
implicit gen: LabelledGeneric.Aux[T, Repr],
selector: Selector.Aux[Repr, k.T, OUT]
): Aux[k.T, T, OUT] = new Extractor[k.T, T] {
type OUT_K = OUT
def extract: T => OUT_K = (e: T) => {
val rep = gen.to(e)
val rprOp: RecordOps[Repr] = new RecordOps[Repr](rep)
rprOp(k)
}
}
}
case class Person(name: String, address: String, age: Int)
implicit val gen = LabelledGeneric[Person]
val nameWit: Witness = 'name
val nameExtractor: Extractor.Aux[nameWit.T, Person, String] = Extractor(nameWit)
def main(args: Array[String]): Unit = {
val joe = Person("Joe", "Brighton", 33)
println(nameExtractor.extract(joe))
}
}
Я использую Scala 2.12.8, и ошибка компилятора
{
"resource": "/workspace/connecterra/stream-data-pipeline/flink/src/main/scala/io/connecterra/ShapelessRecordTest.scala",
"owner": "_generated_diagnostic_collection_name_#0",
"severity": 8,
"message": "could not find implicit value for parameter selector: shapeless.ops.record.Selector.Aux[Repr,ShapelessRecordTest.nameWit.T,OUT]",
"source": "scalac",
"startLineNumber": 37,
"startColumn": 74,
"endLineNumber": 37,
"endColumn": 75
}
Я хотел бы понять, чего мне здесь не хватает,Или это вообще возможно в бесформенном состоянии?