Я пишу FRM с полями, абстрагированными от F[_]
.
trait Query[A]
case class Field[A](name: String)
case class DBTable[T[_[_]]](fields: T[Field]) extends Query[T[Field]]
// example table
case class PersonalInfo[F[_]](name: F[String], age: F[Int])
Я хочу выполнить переписывание запросов, используя схемы рекурсии, поэтому мне нужно определить функтор шаблона,
trait QueryF[A, B]
case class DBTableF[T[_[_]], B](fields: T[Field]) extends QueryF[T[Field], B]
, а затем coalgebra
, чтобы поднять в него запрос:
type Coalgebra[F[_], A] = A => F[A]
def coalg[A]: Coalgebra[QueryF[A, ?], Query[A]] = {
case DBTable(fields) => DBTableF(fields)
}
Это работает, но определение algebra
для преобразования в противоположном направлении не дает:
type Algebra[F[_], A] = F[A] => A
def alg[A]: Algebra[QueryF[A, ?], Query[A]] = {
case DBTableF(value) => DBTable[A](value)
}
функция alg вызывает ошибку компилятора, говоря: constructor of type controllers.thing.DBTableF[T,B] cannot be uniquely instantiated to expected type controllers.thing.QueryF[?,controllers.thing.Query[?]