ドッティでは、次のように指定されています。
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]
これは私には意味がありません。正しい構文があれば、それは何ですか?
PS: にこれ以上型パラメーターを導入したくありませんBaseCreate
。特に、F
それはクラスが意図されたソリューションではないDomain.Create
必要があることを意味します。final case class Create[F[_]]