Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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 如何避免无参数case类?_Scala_Scala Cats - Fatal编程技术网

Scala 如何避免无参数case类?

Scala 如何避免无参数case类?,scala,scala-cats,Scala,Scala Cats,我有以下代码片段,我希望改进: final case class GenderOps[F[_]]() (implicit xa: Transactor[F], ev: Bracket[F, Throwable]) extends GenderDb[F] { override def create: F[Int] = sql""" CREATE TA

我有以下代码片段,我希望改进:

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] = ???

正如您在代码中看到的,
案例类
的参数为空。是否可以避免案例类?

案例类只能用于数据建模,而不能用于处理

这是一种更好的成型方法:

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类只能用于数据建模,不能用于处理

这是一种更好的成型方法:

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] = ???
  }
}

没有参数列表的案例类在Scala 2.10中已被弃用,并在2.11中变得非法。例如,其中一个原因是它们可能导致

case class Foo
Foo // does this refer to companion object or to construction via Foo.apply()?
不带参数列表或空参数列表的Case类很可能应改为
Case对象

case object Foo // instead of case class Foo()
但是,对象不接受类型参数

case object Foo[T] // syntax error

鉴于名称
GenderOps
中的
Ops
后缀,您的意图似乎是用方法来丰富某些类,这些方法表明case类或case对象可能不是正确的工具。相反,如果想通过扩展方法来丰富特性,或者考虑隐含类,则

没有参数列表的case类已经在Scala 2.10中被弃用,在2.11中非法。例如,其中一个原因是它们可能导致

case class Foo
Foo // does this refer to companion object or to construction via Foo.apply()?
不带参数列表或空参数列表的Case类很可能应改为
Case对象

case object Foo // instead of case class Foo()
但是,对象不接受类型参数

case object Foo[T] // syntax error

鉴于名称
GenderOps
中的
Ops
后缀,您的意图似乎是用方法来丰富某些类,这些方法表明case类或case对象可能不是正确的工具。相反,如果你想通过扩展方法丰富特性,可以考虑特性或隐含类。

你总是可以让你的函数自己接受那些隐含的参数。这能回答你的问题吗?一个case类进行处理似乎很奇怪……你可以让你的函数本身接受那些隐式参数。这能回答你的问题吗?一个正在处理的case类看起来很奇怪……我遇到了编译器错误:
语句的非法开始(此处不允许使用修饰符)[error]override def create:F[Int]=[error]^
还有一个问题,为什么定义为
sealed
?@zero\u编码只是为了确保所有实现都在同一个文件中,如果您想要或需要在其他文件中扩展它,您可以删除
密封的
,这真的没有必要,它只是机械地在我身边。我有编译器错误:
语句的非法开始(此处不允许修改符)[error]override def create:F[Int]=[error]^
还有一个问题,为什么定义为密封的?@zero\u编码只是为了确保所有的实现都在同一个文件中,如果你想或需要在其他文件中扩展它,你可以删除密封的
,这真的没有必要,只是机械的。