gpt4 book ai didi

scala - 如何传递带有隐式参数的函数

转载 作者:行者123 更新时间:2023-12-04 21:39:39 26 4
gpt4 key购买 nike

我想传递一个函数 fun1作为 fun2 的参数.
然而fun1需要一个隐式参数。是否可以在 fun2 中定义该隐式值?

代码是这样的:

import org.json4s._
import org.json4s.jackson.JsonMethods._

def fun1(json:JValue)(implicit formats: Formats) = {

//do something
}


def fun2(f: (JValue) => RatEvent,line:String ) = {

implicit val formats = DefaultFormats //has been defined in import
val json = parse(line) //covert string to jvalue
val result = f(json)
}

我这边传 fun1fun2 , 编译器提示它找不到 fun1 的隐式值。
  fun2(fun1,"asdfasdf")    //error here,   fun1 is lack of an implicit value

我想通过改变 fun2的形状来解决问题IE。
def fun2(f: (JValue)(implicit Formats) => RatEvent,line:String ) //doesn't compile

但我不知道如何正确地写。

补充:

声明一个隐式格式似乎是一个很好的解决方案。但我必须在 fun2 中定义它。我已经把问题简单化了。真正的乐趣看起来像:
  def fun2(f: (JValue) => RatEvent,lines:RDD[String] )(implicit sc:SparkContext) = {

for (
line <- lines
){
implicit val formats = DefaultFormats //has been defined in import
val json = parse(line) //covert string to jvalue
val result = f(json)
......
}
}
formats必须在 lines 内定义的 map函数(我用 for 代替)。

最佳答案

Scala 函数值的 apply方法只有一个参数列表,不带任何隐式参数。你对此无能为力。

您可以更改 fun2 的形状将额外参数作为普通参数:

class J; class F; class R

def fun1(j: J)(implicit f: F): R =
new R
def fun2(fn: (J, F) => R) {
fn(new J, new F)
}

fun2(fun1(_)(_))

但是糟糕;调用站点不如 fun2(fun1) 好你自找的。

如果您在调用站点的作用域中有一个隐式 F,那么您可以更改 fun2 的形状。如下:
class J; class F; class R

def fun1(j: J)(implicit f: F): R =
new R

def fun2(fn: J => R)(implicit f: F) {
fn(new J)
}

implicit val f = new F
fun2(fun1)

是的,干净的调用站点!

这符合您的要求吗?在您的问题中,您只有 Formatsfun2 主体内的隐式范围内,但我不知道这是否是您的问题的必要条件,或者只是您压缩代码以适应问题的方式的一些意外。

关于scala - 如何传递带有隐式参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com