尝试从Scala中的其他类型生成类型

我在一个项目上使用Slick,为此我需要一个Slick表示我的行,然后还有一个内存表示.为简洁起见,我将在这里使用一个更简单的例子.比方说,我有这两种类型:

type RawType =
    (String, Int, Boolean)

type RawTypeRep =
    (Rep[String], Rep[Int], Rep[Boolean])

有没有办法从另一个生成一个,所以我不必在锁步中更新它们?

或者也许从案例类生成它们?我确实有一个案例类表示,但它实际上与我的类型略有不同,因为当我给案例类保水时,我会做一些导致类型更改的突变.

最佳答案
这似乎是shapeless的工作,虽然我不确定将其应用到您的案例的最佳方式.我能想到的最好的不是从另一个生成一个,而是至少在编译时验证两者是否匹配:

import shapeless._
import shapeless.poly._
import shapeless.ops.tuple._

object ToRep extends (Id ~> Rep) {
  def apply[A](a: A): Rep[A] = ???
}
type CheckRep[A, B] = Mapper.Aux[A, ToRep.type, B]

type RawType = (String, Int, Boolean)
type RawTypeRep = (Rep[String], Rep[Int], Rep[Boolean])
type RawTypeRepWrong = (Rep[String], Rep[String], Rep[Boolean])

implicitly[CheckRep[RawType, RawTypeRep]] // compiles
implicitly[CheckRep[RawType, RawTypeRepWrong]] // compile error

我猜测,如果回到更大的背景,可能有更好的方法来处理这个问题.可能值得浏览无形文档以查看它可以做的事情,看看是否能给你任何想法.

转载注明原文:尝试从Scala中的其他类型生成类型 - 代码日志