Гладкая, общая черта с скомпилированным запросом - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь создать черту, которая имеет универсальную функцию, которая возвращает пятно Query и имеет значение этой функции, скомпилированное, например:

trait fn1[A1, E, U, C[_]] {
  protected def asc(a1: A1): Query[E, U, C]

  val Asc = Compiled(asc _)
}

Но когда я пытаюсь скомпилироватьЯ получаю эту ошибку:

Computation of type A1 => test.this.profile.api.Query[E,U,C] cannot be compiled (as type C)
val Asc = Compiled(asc _)

, поскольку scala не может вывести неявный параметр compilable: Compilable[V, C] из Compiled.apply

Проблема заключается в параметре типа A1, действительно, он будет компилироваться без проблем:

trait fn1[E, U, C[_]] {
  protected def asc(a1: Rep[Long]): Query[E, U, C]

  val Asc = Compiled(asc _)
}

Я использую слик 3.2.3

Как сделать так, чтобы scala выводил правильное неявное?

1 Ответ

0 голосов
/ 16 декабря 2018

Чтобы скомпилированный макрос работал правильно, вам нужны неявные параметры для этого макроса в области видимости.Поскольку черты не принимают неявные параметры, я делаю эти черты абстрактными классами.

  abstract class Fn1[A, P, E, U, C[_]](implicit ashape: Shape[ColumnsShapeLevel, A, P, A], pshape: Shape[ColumnsShapeLevel, P, P, _]) {
    protected def asc(a1: A): Query[E, U, C]
    lazy val Asc = Compiled(asc _)
  }

Несколько более простой вариант можно использовать, если a1 всегда является Rep[P]

  abstract class Fn2[P, E, U, C[_]](implicit btt: slick.ast.BaseTypedType[P]) {
    protected def asc(a1: Rep[P]): Query[E, U, C]
    lazy val Asc = Compiled(asc _)
  }

Примечание: Если вы не хотите использовать абстрактные классы, вы можете определить неявное определение следующим образом:

trait Fn3[P, E, U, C[_]] {
  implicit def baseTypedTypeP: slick.ast.BaseTypedType[P]
  protected def asc(a1: Rep[P]): Query[E, U, C]
  lazy val Asc = Compiled(asc _)
}

При реализации этой черты вы должны иметь возможность реализовать ее следующим образом (если тип известен):

implicit def baseTypedTypeP: slick.ast.BaseTypedType[Long] = implicitly
...