scala-在特征中,指的是扩展它的对象?
在数据科学中,构建竞争对手模型是很常见的,这些模型扩展了MaximumLikelihoodEstimation等常见功能。例如,您可能有如下内容:scala-在特征中,指的是扩展它的对象?,scala,Scala,在数据科学中,构建竞争对手模型是很常见的,这些模型扩展了MaximumLikelihoodEstimation等常见功能。例如,您可能有如下内容: trait DataFrame trait MaximumLikelihoodEstimation { case class MaximumLikelihoodFit(model: Model, params: Array[Double]) def fit(data: DataFrame): MaximumLikelihoodFit = {
trait DataFrame
trait MaximumLikelihoodEstimation {
case class MaximumLikelihoodFit(model: Model, params: Array[Double])
def fit(data: DataFrame): MaximumLikelihoodFit = {
val params: Array[Double] = ???
// do math
MaximumLikelihoodFit(
model = this.getObject, // getObject doesn't exist... but something like this?
params = params
)
}
}
trait Model // not important, implements things like pdf, cdf
object ModelA extends Model with MaximumLikelihoodEstimation
object ModelB extends Model with MaximumLikelihoodEstimation
object ModelC extends Model with MaximumLikelihoodEstimation
我应该用什么替换
this.getObject
,以获取调用的对象fit
?例如,我希望ModelA.fit
返回MaximumLikelihoodFit(ModelA,params)
您可能需要的调用。编译以下代码:
trait DataFrame
trait Model // not important, implements things like pdf, cdf
trait MaximumLikelihoodEstimation {
self: Model => // this is the magic line!
case class MaximumLikelihoodFit(model: Model, params: Array[Double])
def fit(data: DataFrame): MaximumLikelihoodFit = {
val params: Array[Double] = ???
MaximumLikelihoodFit(
model = this,
params = params
)
}
}
object ModelA extends Model with MaximumLikelihoodEstimation
object ModelB extends Model with MaximumLikelihoodEstimation
object ModelC extends Model with MaximumLikelihoodEstimation
如果出于某种原因,这对您不起作用,那么您唯一的选择可能是显式地引入getObject
方法。IMHO导致最少键入的方式如下:
trait DataFrame
trait ModelProvider {
val model:Model
}
trait Model extends ModelProvider {
override val model: Model = this
}
trait MaximumLikelihoodEstimation {
self: ModelProvider =>
case class MaximumLikelihoodFit(model: Model, params: Array[Double])
def fit(data: DataFrame): MaximumLikelihoodFit = {
val params: Array[Double] = ???
MaximumLikelihoodFit(
model = this.model,
params = params
)
}
}
object ModelA extends Model with MaximumLikelihoodEstimation
object ModelB extends Model with MaximumLikelihoodEstimation
object ModelC extends Model with MaximumLikelihoodEstimation
什么是
getObject
?您的问题与标题冲突。在标题中,你似乎要求self
-参考最大似然度估计值
,在问题中,你要求“调用fit的对象”。那么,你想要哪一个呢?1)你在def-fit之后缺少=
。
2)你不能扩展对象s 3)反射可能与它无关;它没有编译,问题也不清楚。“请把它修好。”安德烈·尤金说。谢谢,根据您的评论更新。不过它不应该编译——这就是重点(我想要一些东西来替换不存在的getObject
方法)@NickResnick谢谢你。显然,在本例中,没有必要使用“几乎可编译”(+-一行)示例,因为SergGr已经猜出了所有可能的正确解决方案;)太棒了,自我类型成功了,谢谢。这是否意味着这个内最大似然估计将实际参考模型?仍然在学习scala的类型系统…@NickResnick在运行时,它无论如何都会引用模型
,但是使用{this:Model=>…}
,编译器在编译时知道这个
将是模型
类型,并且所有类型都会检查。原则上,您可以通过强制转换到Model
来强制编译它,然后它就会运行。但是这将是非常脆弱和不安全的。@NickResnick,我认为您感兴趣的测试是尝试编译对象测试扩展最大可能性估计(即没有模型
),然后看看编译器会说什么。