Scala中具体用例的类型参数/抽象类型
我有一个参数化ADT: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
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再次强调,它实际上取决于您的最终目标。我觉得您应该定义一个采用多区域
的方法,而不是隐式的=:=
参数,因为后者是一种代码气味