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

value is not a member of type parameter 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, None, Some(ModelContract("ModelName", Some(ModelSignature("infer", Seq(ModelField(name="blah", profile=DataProfileType.NUMERICAL)), Seq.empty[ModelField])))), None, "", 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.ModelVersionmonitoringConfiguration 字段。我猜这与F有关。有没有办法可以访问 model 中的 batchSize

这取决于您对 higher-kinded 类型 F 的限制。如果您的 F 是仿函数,那么您可以使用 map 访问其中的值。如果 FFlatMapMonad,您也可以使用 flatMap.

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

程序的结构方式是您的值始终在 F 内部,直到您真正需要将其取出。这是通过将 F 初始化为某种具体类型来完成的,例如IO 来自 cats-effect,或来自原生 scala 库的 Future。或者,如果您不执行任何 side-effects,它可以像 Option 一样简单。一旦类型是具体的,您就有不同的方法来获取值,具体取决于类型。 Future可以是.onCompleteOption可以是.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)