【问题标题】:How to declare implicit arguments in higher order functions?如何在高阶函数中声明隐式参数?
【发布时间】:2013-10-22 13:18:52
【问题描述】:

我想要更高阶函数中的隐式参数,例如:

func(arg1) { 隐式 (x, y) => x * y }

但是编译器说:

错误:预期的定义开始 val a = func("2", "4") { 隐式 (x, y) => ^

  • java版本“1.7.0_40”
  • Scala 代码运行程序版本 2.10.2-RC2 -- 版权所有 2002-2013,LAMP/EPFL

可运行的示例代码:

object Test extends App {
    new Test().run
}

class Test {
    def run = {
        val a = func("2", "4") { (x, y) => // It's OK
            x * y
        }
        println("a: " + a)

        val b = gunc("2", "4") { implicit x => { implicit y => // It's OK
            x * y
        }}
        println("b: " + b)
    }

    def func(x: String, y: String)(f: (Int, Int) => Int) = f(x.toInt, y.toInt)
    def gunc(x: String, y: String)(g: Int => Int => Int) = g(x.toInt)(y.toInt)
    def hunc(x: String, y: String)(h: Tuple2[Int, Int] => Int) = h((x.toInt, y.toInt))
}

[添加评论]

我想知道...

我们可以用一个 arg 声明为“隐式 x => ...”。

似乎没有办法声明两个隐式参数。

【问题讨论】:

  • 它显然不能解决问题,但你为什么不更新到 final 版本的 Scala,例如2.10.2 还是 2.10.3?
  • 没有理由 => 我更新了 2.10.2。 “显然”是什么意思? Scala Prog Lang Spec 提到了这个问题?
  • 我说 显然 因为解析器的工作方式(您的问题是语言语法)通常不会在候选版本和最终版本之间发生变化。因此,升级到稳定版本并不能解决此问题,而是会为您带来整体稳定性。

标签: scala


【解决方案1】:

尝试添加:

val c = hunc("2", "4") { implicit pair => pair._1 * pair._2 }

【讨论】:

  • 谢谢。有用。但它是 'ONE arg' 示例而不是 'TWO args'。
【解决方案2】:

当你说implicit y => y * 2 你不是 声明一个隐式参数,但将函数标记为隐式, 所以你做一个类比:

implicit val f1 = (y: Int) => y * 2
def func1(x: String, y: String)(f: Int => Int) = f(1)
func1("", "")(f1)

当你想用两个标记一个函数时 隐含的参数你可以这样做:

implicit val f2 = (x: Int, y: Int) => y * 2
def func2(x: String, y: String)(f: (Int, Int) => Int) = f(1, 2)
func2("", "")(f2)

但你不能这样做: func2("", "")(implicit (x, y) => x),在这种特殊情况下,我只是看不出使用隐含的任何意义。

你也可以看到这个问题,也许你会发现一些有用的信息there

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 2021-01-20
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2019-09-22
    相关资源
    最近更新 更多