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

标签 scala types slick

我在一个项目中使用 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

我猜想如果退一步到更大的上下文,可能有更好的方法来处理这个问题。可能值得浏览一下 Shapeless 的文档,看看它可以做哪些事情,看看这是否能给您带来任何想法。

关于scala - 尝试从 Scala 中的其他类型生成类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989231/

相关文章:

string - 在 Scala 中替换字符串中的字符

c++ - 有什么办法可以将c-union-style与type-punning一起使用c++?

types - 在函数式编程中确定函数的类型

scala - 达到 float 的队列时该怎么办?

Scala Slick Lazy Fetch

java - 在没有 JVM 支持的情况下,如何在 JVM 语言中实现协程?

scala - Splitter.isParallel 返回 false? (版本2.10.2)

sql - Slick 3.1 - 从 DBIOAction 打印 SQL(插入语句)

scala - 如何等待多个 future ?

haskell - 更高级的函数?