如何避免无参数情况class?

How to avoid parameterless case class?

我有以下代码片段,我想对其进行改进:

final case class GenderOps[F[_]]()
                                (implicit xa: Transactor[F],
                                 ev: Bracket[F, Throwable]) extends GenderDb[F] {
  override def create: F[Int] =
    sql"""
    CREATE TABLE interests
    (
      id smallserial NOT NULL,
      interest character varying(40) NOT NULL,
      PRIMARY KEY (id)
    )
    """.update.run.transact(xa)

  override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ???

如您在代码中所见,case class 参数为空。是否可以避免 case class?

案例class只能用于数据建模,不能用于处理。

这将是更好的塑造方式:

sealed trait GenderDb[F[_]] {
  def create: F[Int]

  def seed[L[_] : Foldable](v: L[Gender]): F[Int]
}

object GenderDb {
  def apply[F[_]](implicit xa: Transactor[F], ev: Bracket[F, Throwable]): GenderDb[F] = new GenderDb[F] {
    override def create: F[Int] =
      sql"""
      CREATE TABLE interests
      (
        id smallserial NOT NULL,
        interest character varying(40) NOT NULL,
        PRIMARY KEY (id)
      )
      """.update.run.transact(xa)

    override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ???
  }
}

Case class不带参数列表的情况在 Scala 2.10 中已被弃用,并在 2.11 中被定为非法。原因之一是它们可能导致confusion,例如

case class Foo
Foo // does this refer to companion object or to construction via Foo.apply()?

没有参数列表或参数列表为空的情况 class 应该 case object 而不是

case object Foo // instead of case class Foo()

但是对象不接受类型参数

case object Foo[T] // syntax error

鉴于名称 GenderOps 中的 Ops 后缀,您的意图似乎是用指示 case classes 或 case 对象可能的方法来丰富一些 class不是正确的工具。如果您想通过扩展方法进行丰富,请考虑 trait 或隐式 class。