1

ドッティでは、次のように指定されています。

object Domain {
  final case class Create(name: String) extends BaseCreate[Create] {
    override type Model = Domain
    override def service[F[_]](client: KeystoneClient[F]): CrudService[F, Domain, Create] = client.domains
  }
}
case class Domain(id: String)

class CrudService[F[_], Model, Create]
final class Domains[F[_]] extends CrudService[F, Domain, Domain.Create]

class KeystoneClient[F[_]] {
  val domains = new Domains[F]
}

trait BaseCreate[Create <: BaseCreate[Create]] {                                                                                                        
  type Model
  def service[F[_]](client: KeystoneClient[F]): CrudService[F, Model, Create]
}

BaseCreate次のように実装できるように「単純化」したいと思いCreateます。

final case class Create(name: String) extends BaseCreate.Aux[Domain, Create](_.domains)

私はもう試した:

object BaseCreate {
  abstract class Aux[M, Create](f: [F[_]] =>> KeystoneClient[F] => CrudService[F, M, Create]) extends BaseCreate[Create] {                                        
    type Model = M
    def service[F[_]](client: KeystoneClient[F]): CrudService[F, Model, Create] = f(client)
  }
}

しかし、コンパイラは次のように文句を言います:

Missing type parameter for [F[_$5]] =>> KeystoneClient[F] => CrudService[F, M, Create]

これは私には意味がありません。正しい構文があれば、それは何ですか?

このコードで scastie にリンクします

PS: にこれ以上型パラメーターを導入したくありませんBaseCreate。特に、Fそれはクラスが意図されたソリューションではないDomain.Create必要があることを意味します。final case class Create[F[_]]

4

1 に答える 1