Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 不同类型的标签书_Scala_Shapeless - Fatal编程技术网

Scala 不同类型的标签书

Scala 不同类型的标签书,scala,shapeless,Scala,Shapeless,鉴于这些ADT: case class SourceRecord(name: String, number: Int) case class TargetRecord(number: Int, name: String) 我可以轻松地从SourceRecord映射到TargetRecord: val sourceGen = LabelledGeneric[SourceRecord] val targetGen = LabelledGeneric[TargetRecord] val source

鉴于这些ADT:

case class SourceRecord(name: String, number: Int)
case class TargetRecord(number: Int, name: String)
我可以轻松地从
SourceRecord
映射到
TargetRecord

val sourceGen = LabelledGeneric[SourceRecord]
val targetGen = LabelledGeneric[TargetRecord]
val sourceRecord = SourceRecord("record_1", 1)
val targetRecord = targetGen.from(sourceGen.to(sourceRecord).align[targetGen.Repr])
但是,如果引入新类型,我很难理解如何执行转换:

case class MyNumber(value: Int) extends AnyVal
case class SourceRecord(name: String, number: Int)
case class TargetRecord(number: MyNumber, name: String)

Error: could not find implicit value for parameter align: shapeless.ops.hlist.Align[sourceGen.Repr,targetGen.Repr]

我猜我需要以某种方式提供一个type类来将
Int
MyNumber
对齐,但我不知道如何对齐。有人能告诉我吗?

您可以手动将其定义如下:

import shapeless.labelled.FieldType
import shapeless.ops.hlist.Align
import shapeless.record.Record
import shapeless.{::, HNil, Witness}
import shapeless.syntax.singleton._

implicit val align: Align[Record.`'name -> String, 'number -> Int`.T, Record.`'number -> MyNumber, 'name -> String`.T] = {
  case s :: (i: FieldType[Witness.`'number`.T, Int]) :: HNil => 'number ->> MyNumber(i) :: 'name ->> s :: HNil
}

您可能需要使用
Unwrapped
来讨论哪些类型只是“包装”而不是实际的类型。除此之外,我不确定你需要重新实施多少。。。