Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala-在特征中,指的是扩展它的对象?_Scala - Fatal编程技术网

scala-在特征中,指的是扩展它的对象?

scala-在特征中,指的是扩展它的对象?,scala,Scala,在数据科学中,构建竞争对手模型是很常见的,这些模型扩展了MaximumLikelihoodEstimation等常见功能。例如,您可能有如下内容: trait DataFrame trait MaximumLikelihoodEstimation { case class MaximumLikelihoodFit(model: Model, params: Array[Double]) def fit(data: DataFrame): MaximumLikelihoodFit = {

在数据科学中,构建竞争对手模型是很常见的,这些模型扩展了MaximumLikelihoodEstimation等常见功能。例如,您可能有如下内容:

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,我认为您感兴趣的测试是尝试编译
对象测试扩展最大可能性估计(即没有
模型
),然后看看编译器会说什么。