gpt4 book ai didi

scala:混合取决于参数类型

转载 作者:行者123 更新时间:2023-12-04 10:45:38 25 4
gpt4 key购买 nike

我有一组模型类,以及一组可以在模型上运行的算法。并非所有类别的模型都可以执行所有算法。我希望模型类能够声明它们可以执行的算法。模型可以执行的算法可能取决于其参数。

示例:假设我有两个算法,MCMC 和重要性,表示为特征:

trait MCMC extends Model {
def propose...
}

trait Importance extends Model {
def forward...
}

我有一个模型类 Normal,它接受一个均值参数,它本身就是一个模型。现在,如果mean实现了MCMC,我希望Normal实现MCMC,如果mean实现Importance,我希望Normal实现Importance。

我可以写:
类正常(平均值:模型)扩展模型{
//一些常见的东西放在这里
}
class NormalMCMC(mean: MCMC) extends Normal(mean) with MCMC {
def propose...implementation goes here
}

class NormalImportance(mean: Importance) extends Normal(mean) with Importance {
def forward...implementation goes here
}

我可以创建工厂方法,以确保使用给定的平均值创建正确类型的 Normal。但显而易见的问题是,如果均值同时实现了 MCMC 和重要性呢?然后我希望 Normal 也实现它们。但我不想创建一个重新实现建议和转发的新类。如果 NormalMCMC 和 NormalImportance 不带参数,我可以使它们成为特征并将它们混合在一起。但在这里我希望混合取决于参数的类型。有没有好的解决办法?

最佳答案

使用 self types允许您将模型算法实现与实例化分开并将它们混合在一起:

trait Model
trait Result
trait MCMC extends Model {
def propose: Result
}
trait Importance extends Model {
def forward: Result
}

class Normal(val model: Model) extends Model

trait NormalMCMCImpl extends MCMC {
self: Normal =>
def propose: Result = { //... impl
val x = self.model // lookie here... I can use vals from Normal
}
}
trait NormalImportanceImpl extends Importance {
self: Normal =>
def forward: Result = { // ... impl
...
}
}

class NormalMCMC(mean: Model) extends Normal(mean)
with NormalMCMCImpl

class NormalImportance(mean: Model) extends Normal(mean)
with NormalImportanceImpl

class NormalImportanceMCMC(mean: Model) extends Normal(mean)
with NormalMCMCImpl
with NormalImportanceImpl

关于scala:混合取决于参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037556/

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