Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 高阶函数的隐式不可解性_Scala_Implicit - Fatal编程技术网

Scala 高阶函数的隐式不可解性

Scala 高阶函数的隐式不可解性,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.

我有一个函数create将提供参数DSLContext of
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