值不是类型参数F []的成员

问题描述

我有此代码:

trait ModelDataService[F[_]] {
  def getModelVersion(modelVersionId: Long): F[ModelVersion]
}

class ModelDataServiceIdInterpreter[F[_] : Monad] extends ModelDataService[F] {
  override def getModelVersion(modelVersionId: Long): F[ModelVersion] = {
    val mv = ModelVersion(1,1,"ModelType","Status",None,Some(ModelContract("ModelName",Some(ModelSignature("infer",Seq(ModelField(name="blah",profile=DataProfileType.NUMERICAL)),Seq.empty[ModelField])))),"",None)
    Monad[F].pure(mv)
  }
}

我正在尝试这样做:

    val model = modelDataService.getModelVersion(modelVersionId)
    val batchSize = model.monitoringConfiguration

我收到一个编译错误

 value monitoringConfiguration is not a member of type parameter F[a.grpc.entities.ModelVersion]

但是,a.grpc.entities.ModelVersion具有monitoringConfiguration字段。我想这与F有关。有什么方法可以访问batchSize内部的model

解决方法

这取决于您对类型较高的类型F的约束。如果您的F是函子,则可以使用map访问内部的值。如果FFlatMapMonad,也可以使用flatMap

val batchSize: F[Long] =
  modelDataService
    .getModelVersion(modelVersionId)
    .map(_.monitoringConfiguration)

程序的结构方式是,您的价值将始终在F内,直到您真正需要将其取出为止。这是通过将F初始化为某种具体类型来完成的,例如IO来自cats-effect,或Future来自本地scala库。或者,如果您不执行任何副作用,则可以像Option那样简单。一旦确定了具体的类型,就可以根据类型使用不同的方法来获取价值。对于Future可以是.onComplete,对于Option可以是.getOrElse,等等。

val service: ModelDataService[Option] = new ModelDataServiceIdInterpreter[Option]
val maybeBatchSize: Option[Long] =
  modelDataService
    .getModelVersion(modelVersionId)
    .map(_.monitoringConfiguration)

val batchSizeDefaultValue = 10L
val batchSize = maybeBatchSize.getOrElse(batchSizeDefaultValue)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...