gpt4 book ai didi

scala - 尝试使用类型参数编写 DRY Scala 代码

转载 作者:行者123 更新时间:2023-12-01 10:49:05 26 4
gpt4 key购买 nike

我已经定义了一些案例类,它们都有一个字段 id:Id[T],其中 T 是案例类的类型。我希望有一个特征来强制执行此属性以在这些类上编写通用代码。

我的第一次尝试是在特征上使用类型参数和自身类型来强制执行此属性:

case class Id[M](value: Long)

trait EnforceIdType[T] {
this: T =>
val id: Id[T]
}

case class A(id: Id[A]) extends EnforceIdType[A]
case class B(id: Id[B]) extends EnforceIdType[B]
// case class C(id: Id[B]) extends EnforceIdType[B] < Won't compile, as expected

这很好,但我想知道是否有一种方法可以在不对特征使用类型参数的情况下执行相同的操作。这是我的第二次尝试:

case class Id[M](value: Long)

trait EnforceIdType {
val id: Id[_ <: EnforceIdType]
}

case class A(id: Id[A]) extends EnforceIdType
case class B(id: Id[B]) extends EnforceIdType
case class C(id: Id[B]) extends EnforceIdType // Compiles :(

具体来说,我想使用案例类的这些定义(不将类型参数传递给 EnforceIdType),但仍强制执行该属性(此 C 不应编译)。有什么办法吗?我觉得像 this.type 这样的东西可以用在这里,但我不是很熟悉。

最佳答案

你是对的,需要使用this.type,但有一些限制:

trait EnforceIdType {
def id: Id[_ >: this.type <: EnforceIdType]
}

case class A(id: Id[A]) extends EnforceIdType
case class B(id: Id[B]) extends EnforceIdType
//case class C(id: Id[B]) extends EnforceIdType // Won't compile, as expected

更新:

关于第二个限制(由 Alexey Romanov 展示)。可以消除,但路途遥远:

//Embeded polymorphism used
class Id(val value: Long) {
type M
}

// Factory method for shift type variable to type parameter field
object Id {
def apply[T](value : Long) = new Id(value) { type M = T }
}

trait EnforceIdType {
type This = this.type // store this.type for use inside Id { type M = .. }
val id: Id { type M >: This <: EnforceIdType } // need to be val

def show(x : id.M) { println (x) } // dependent method
}

case class A(id: Id { type M = A }) extends EnforceIdType
case class B(id: Id { type M = B }) extends EnforceIdType
// case class C(id: Id { type M = B }) extends EnforceIdType // Won't compile, as expected

val a = A( Id[A](10))
val b = B( Id[B](10))

a.show(a)
// a.show(b) // Won't compile, as expected

关于scala - 尝试使用类型参数编写 DRY Scala 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22658605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com