部分应用递归函数

3
def mainCaller() = { 
  val name = "xyz"
  someList.foreach { u:Map => foo(name, u) }
}

def foo(name:String)(map:Map): Unit = {
  //match case....
  //recursive call to foo in each case where name remains same, but map changes
}

我该如何将foo写成一个部分应用函数,使得在每次递归调用时无需传递name参数,只需调用foo(map1)即可?

1个回答

8

两个选择:

def foo(name:String)(map:Map): Unit = {
    val bar = foo(name)_
    //match case...
    // case 1:
    bar(x)

    // case 2:
    bar(y)
}

或者:

def foo(name:String): Map => Unit = {
    def bar(map: Map): Unit = {
        //match case...
        // case 1:
        bar(x)

        // case 2:
        bar(y)
    }
    bar
}

真是太棒了! 这两种方法有什么优缺点吗? 第一种方法看起来更加简洁。 - scout
@scout:我想不到任何一种(不)有利的情况。顺便说一下,我犯了一个错误。在第一个例子中,在foo(name)之后需要一个下划线。 - sepp2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接