2014-09-23 2 views
2

Я получил функцию создать собирается обеспечить параметр DSLContext из op: DSLContext => T:неявной не разрешены на функции высокого порядка

def create[T](op: DSLContext => T)(implicit errorHandler: Throwable => Unit):Option[T] = { 
    ... 
    op(new DSLContext) 
    ... 
} 

Тогда я передаю следующую функцию, чтобы создать:

def query(implicit dsl:DSLContext) 

А вот вызов

create(query) 

Я получил эту ошибку компилятора:

could not find implicit value for parameter dsl: org.jooq.DSLContext [error] create (query)

я могу решить эту проблему так: create {implicit dsl => query}

Однако я удивляюсь, почему компилятор не может разрешить неявный параметр как DSL данного параметра?

+1

Вам нужно '' DSLContext => T'', вы передаете '' DSLContext'' и получите сообщение об ошибке. Когда вы передаете '' DSLContext => T'', нет ошибки. Что не так? –

+1

То же самое. Не совсем уверен, чего вы ожидаете. – vptheron

+0

@JeanLogeart - это DSLContext => T, а не только DSLContext. Поэтому, когда я передаю запрос как параметр create, я передаю функцию, берущую DSLContext и возвращающую T. – Hexx

ответ

4

Проблема заключается в том, что при передаче метода, в котором ожидается функция, компилятор должен выполнить eta-расширение для его преобразования.

Другими словами, метод query должен стать Function1[DSLContext, T].

Однако компилятор должен разрешить неявный параметр, чтобы иметь возможность применения eta-расширения. В вашем случае в области нет DSLContext, поэтому компилятор не выполняет этого.

Вы можете воспроизвести это поведение с более простым примером, вот РЕПЛА сессия демонстрирует это:

scala> def foo(implicit i: Int) = "hello" 
foo: (implicit i: Int)String 

scala> foo _ 
<console>:10: error: could not find implicit value for parameter i: Int 
       foo _ 
      ^

scala> implicit val x = 5 
x: Int = 5 

scala> foo _ 
res3: scala.collection.immutable.WrappedString = hello 

где _ вручную запускает ETA-расширение.

Для записи это описано в пункте 6.26.2 в пункте language reference.

If the method takes only implicit parameters, implicit arguments are passed following the rules of §7.2.

Смежные вопросы