【问题标题】:Attempting to generate types from other types in Scala尝试从 Scala 中的其他类型生成类型
【发布时间】:2019-01-30 00:51:26
【问题描述】:

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

type RawType =
    (String, Int, Boolean)

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

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

或者也许从一个案例类中生成它们?我确实有一个案例类表示,但它实际上与我所拥有的类型略有不同,因为当我对案例类进行水合时,我会进行一些导致类型更改的突变。

【问题讨论】:

  • 我不知道具体的步骤,但我想到了两件事:1.正在探索 scala 宏,它应该能够做到这一点,即使我不知道如何 2. slick 是否带有一个代码生成器,用于根据您的数据库生成类,也许这是您可能愿意使用的东西?

标签: scala types slick


【解决方案1】:

这似乎是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

我猜可能有更好的方法来处理这个问题,让我们回到更大的背景。可能值得浏览一下 shapeless 的文档,看看它可以做什么,看看是否能给你任何想法。

【讨论】:

  • 幸运的是,如果它们不正确,编译器会警告我。我只是想从 n 更新到 1 更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2015-11-21
  • 2020-01-06
  • 2021-11-27
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
相关资源
最近更新 更多