Scala 高阶函数的隐式不可解性
我有一个函数create将提供参数DSLContext ofScala 高阶函数的隐式不可解性,scala,implicit,Scala,Implicit,我有一个函数create将提供参数DSLContext ofop:DSLContext=>T: def create[T](op: DSLContext => T)(implicit errorHandler: Throwable => Unit):Option[T] = { ... op(new DSLContext) ... } 然后我传递以下函数来创建: 这是电话 create(query) 我遇到了以下编译器错误: 找不到参数dsl的隐式值:org.jooq.
op:DSLContext=>T
:
def create[T](op: DSLContext => T)(implicit errorHandler: Throwable => Unit):Option[T] = {
...
op(new DSLContext)
...
}
然后我传递以下函数来创建:
这是电话
create(query)
我遇到了以下编译器错误:
找不到参数dsl的隐式值:org.jooq.DSLContext
[错误]创建(查询)
我可以这样解决这个问题:create{implicit dsl=>query}
但是,我想知道为什么编译器无法将隐式参数dsl解析为给定参数?这里的问题是,当您传递一个方法时,如果需要函数,编译器需要执行eta扩展来转换它 换句话说,方法
query
需要成为函数1[DSLContext,T]
但是,编译器需要解析隐式参数才能应用eta扩展。在您的例子中,作用域中没有DSLContext
,因此编译器无法这样做
您可以用一个更简单的示例重现此行为,下面是一个REPL会话,演示了它:
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
scala>def foo(隐式i:Int)=“你好”
foo:(隐式i:Int)字符串
scala>foo_
:10:错误:找不到参数i:Int的隐式值
福_
^
scala>隐式val x=5
x:Int=5
scala>foo_
res3:scala.collection.immutable.WrappedString=hello
其中手动触发eta扩展
关于记录,请参见第6.26.2.段
如果该方法仅采用隐式参数,则隐式参数将按照§7.2的规则传递
您需要DSLContext=>T
,您通过DSLContext
并得到一个错误。当您传递DSLContext=>T
时,没有错误。怎么了?一样。不太确定您期望的是什么。@JeanLogeart查询是DSLContext=>T,而不仅仅是DSLContext。因此,当我将查询作为create的参数传递时,我传递了一个函数,该函数接受DSLContext并返回T。他希望将方法引用而不是匿名函数传递给create
<代码>查询
就是这种方法。换句话说,他想部分应用带有隐式参数的方法,而这正是编译器感到困惑的地方。@Hexx我建议您修改query
,以获取普通(非隐式)参数,并将其分配给本地隐式val
def查询(dsl:DSLContext)={implicit val idsl=dsl;…}
。
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