我正在尝试编写一个可以采用type(String)=>函数的方法。单元。这似乎不起作用。
val sayHelloToPerson : (String) => Unit = (s : String) => { println("Hello " + s) }
如果我打电话
,这是有效的sayHelloToPerson("Mark")
但是,如果我从下面的方法中调用它
def executeAnyFunction (f: (String) => Unit) = {
f()
}
executeAnyFunction(sayHelloToPerson("Mark"))
编译器说,
type mismatch, expected: String => Unit, actual: Unit.
不是(String) => Unit
类型的函数本身吗?
答案 0 :(得分:1)
通过在定义executeAnyFunction时执行此操作,您将调用函数f,而不使用任何参数,因此编译器失败。
你应该做的是返回f,但不调用它(没有括号):
def executeAnyFunction (f: (String) => Unit) = {
f
}
然后您可以按如下方式使用新功能
executeAnyFunction(sayHelloToPerson)("Mark")
executeAnyFunction(sayHelloToPerson)
与f
相同,并为其指定参数("Mark")
这里的简单示例:
答案 1 :(得分:0)
因为你用函数的应用叫你第二种方法。
尝试executeAnyFunction(sayHelloToPerson)
并更改正文以将String
参数传递给f
。 e.g。
def executeAnyFunction (f: (String) => Unit) = {
f("Mark")
}
executeAnyFunction(sayHelloToPerson)
答案 2 :(得分:0)
也许你的意思是:
def executeAnyFunction(f: (String) => Unit)(s: String) = f(s)
executeAnyFunction(sayHelloToPerson)("Mark")
// prints "Hello Mark"
这将executeAnyFunction
定义为具有两个参数列表的函数:一个具有要执行的函数,另一个具有该函数的输入。
但是,不确定executeAnyFunction
除了教育之外还有什么价值。