scala - 传递一个将另一个函数作为参数的函数

时间:2014-01-23 19:04:33

标签: function scala parameters arguments higher-order-functions

我试图将函数作为参数传递,但该函数有多个参数(其中一个是函数)。

以下是我在基本的Python示例中尝试做的事情:

def first(string1, string2, func):
    func(string1, string2, third)

def second(string1, string2, func):
    func(string1, string2)

def third(string1, string):
    # operations go here

first("one", "two", second)

我在Scala的尝试如下:

def first(string1: String, string2: String, func: (Any, Any, Any) => Unit) = {
    func(string1, string2, func)
}
def second(string1: String, string2: String, func: (Any, Any) => Unit) = {
    func(string1, string2)
}

def third(string1: String, string2: String) = {
    // operations
}

def main(args: Array[String]): Unit = {
    first("one", "two", second)
}

我在尝试将second传递给first并且参数数量不足时收到错误。是否有可能以与Python示例相同的样式实现此功能?

修改

我尝试用first("one", "two", second _)替换主方法的主体,它给我一个类型不匹配错误

  

类型不匹配; found:(String,String,(Any,Any,Any)=> Unit)=>所需单位:(任何,任何,任何)=>    单元

知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

您尝试做的不是类型安全的。您无法将(String, String, (Any, Any) => Unit) => Unit分配给(Any, Any, Any) => Unit。如果可以,那么您可以执行以下操作:

val f = second _
val af: (Any, Any, Any) => Unit = f
af(1, "abc", 5)

如果您更精确地指定类型,则可以执行此操作:

def second(string1: String, string2: String, func: (String, String) => Unit) = {
    func(string1, string2)
}

def third(string1: String, string2: String) = {
    // operations
}

def first(string1: String, string2: String, func: (String, String, (String, String) => Unit) => Unit) = {
    func(string1, string2, third)
}