Scala中具体用例的类型参数/抽象类型

Scala中具体用例的类型参数/抽象类型,scala,type-systems,algebraic-data-types,Scala,Type Systems,Algebraic Data Types,我有一个参数化ADT: sealed trait Location[O] sealed abstract class SingleRegion(val bucket: String) extends Location[String] sealed abstract class MultiRegion(val buckets: Seq[String]) extends Location[Seq[String]] sealed abstract class Synchroniz

我有一个参数化ADT:

  sealed trait Location[O]

  sealed abstract class SingleRegion(val bucket: String) extends Location[String]

  sealed abstract class MultiRegion(val buckets: Seq[String]) extends Location[Seq[String]]

  sealed abstract class Synchronized(val bucket: String) extends Location[Seq[String]]
我定义了一个包含位置的类日志

  final  case class Log[O, L <: Location[O]](location: L) {
    def find(
        bucket: String
    )(implicit ev: L =:= MultiRegion): Option[Log[String, _ <: SingleRegion]] =
      location.buckets
        .find(_ == bucket)
        .map(bucket => Log(new SingleRegion(bucket) {}))
  }

  val log: Log[Seq[String], MultiRegion] = Log(new MultiRegion(List("r1", "r2")) {})
  println(log.find("r1"))

最终案例类日志[O,L这似乎适合我。
如果不适合你,请告诉我

final case class Log[O, L](location: L)
                          (implicit ev: L <:< Location[O]) {
  def find(bucket: String)
          (implicit ev: L =:= MultiRegion): Option[Log[String, SingleRegion]] =
    location
      .buckets
      .find(_ == bucket)
      .map(bucket => Log(new SingleRegion(bucket) {}))
}
最终案例分类日志[O,L](位置:L)
(隐式ev:L Log(新的单区域(bucket){}))
}

不错的选择。仍然存在冗余的
日志[String,SingleRegion]
(对于SingleRegion,它必须是一个字符串)。那么,在这种情况下,抽象类型不是更好的选择吗?@YannMoisan再次强调,它实际上取决于您的最终目标。我觉得您应该定义一个采用
多区域
的方法,而不是隐式的
=:=
参数,因为后者是一种代码气味