首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的返回隐函数

Scala中的返回隐函数
EN

Stack Overflow用户
提问于 2021-01-15 14:10:06
回答 1查看 86关注 0票数 0

我现在有这个设置,在这里我有一个方法和一些隐式资源,该方法返回一个函数,我以后可以在我的代码中使用。

代码语言:javascript
复制
type AResource = Int

def testA(s: String)(implicit aResource: AResource): (Double) => (String, Int) = (d: Double) => {
  (s + d, d.toInt * aResource)
}

implicit val ar:AResource = 3

val fA = testA("org: ")
fA(3.1415)

这将像预期的那样打印(org: 3.1415,9)。到目前一切尚好

然而,有时我想要在一个单线器中调用此方法,这迫使我将隐式显式化。

代码语言:javascript
复制
val fA2 = testA("org2: ")(ar)(1.123)

这似乎有点麻烦,但问题实际上要复杂一些,因为我的方法使用了TypeTag并将隐式typeTag注入到函数中。

我所要寻找的是一种定义testA的方法,这样返回函数就实现了is。

像这样(显然不起作用)

代码语言:javascript
复制
def testB(s: String): (Double, AResource) => (String, Int) = (d: Double)(implicit aResource: AResource) => {
 (s + d, d.toInt * aResource)
}

但那样我就可以跑了

代码语言:javascript
复制
testB("org2: ")(1.123)

担心在最低层次上引发的情绪

更新:

我至少找到了这个解决方案,但还不是百分之百完美

代码语言:javascript
复制
def testC(s: String): (Double) => (AResource) => (String, Int) = (d: Double) => { implicit aResource: AResource => {
  (s + d, d.toInt * aResource)
}}

val c:(String, Int) = testC("org: ")(2.4)(ar)

它确实将隐式向下移动,但我仍然必须传递硬编码。

更新2:

Tim为玩具问题提供了一个很好的解决方案,但只起作用,因为在定义过程中,隐式资源已经在范围内。

当隐式从作用域中移除时,定义将失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-15 14:25:33

您可以将它写成一个curried函数,并在第一次使用时使用Eta展开:

代码语言:javascript
复制
def testC(s: String)(d: Double)(implicit aResource: AResource) =
  (s + d, d.toInt * aResource)

val fC = testC("org: ") _
fC(3.1415)

testC("33")(2.0)

以前的不正确答案

您可以这样实现testB

代码语言:javascript
复制
def testB(s: String) = {
  def f(d: Double)(implicit aResource: AResource) = (s + d, d.toInt * aResource)

  f _
}

你可以把这叫做两种方式:

代码语言:javascript
复制
val fB = testB("org: ")
fB(3.1415)

testB("org2: ")(1.123)

这是因为隐式解析是在testB内部完成的,而不是在调用f时完成的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65737568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档