我可以将任意函数传递给Scala中的另一个函数吗?
|
我是Scala的新手,能够将函数传递给其他函数非常巧妙-但是我可以将任意函数引用传递给另一个函数吗?所述功能参数的Arity将是固定的(也就是说,我也很好奇您是否也可以通过任意Arity传递函数)。我一直被类型错误绊倒。我尝试使用
Any
,但似乎无济于事。
例如,我有以下代码:
class CodeRunner(val user_defined: (Int) => Unit) {
def run(input: Int) = {
user_defined(input)
}
}
def arbitrary_code(input: Int) = { println(\"Running with input \" + input) }
val d1 = new CodeRunner(arbitrary_code)
d1.run(4)
我得到:
Running with input 4
现在,假设我要传递以下函数:
def arbitrary_code(input: String) = { println(\"Running with input \" + input) }
如何更改我的CodeRunner
班级以同时处理这两个类?
没有找到相关结果
已邀请:
5 个回复
校勒魏寡
\“ Class CodeRunner \”之后的[T]是重要的部分,它定义了将在类定义中使用的泛型T(可以用另一个大写字母替换T,等等)。 因此,如果您定义一个方法:
然后将其传递给:
...然后,编译器说“啊哈,对于此CodeRunner实例,泛型T是字符串”。如果您调用
编译器会很高兴,但不会让您传入d1.run(4)。
豹芜澈
班级以同时处理这两个类? 您可以使任意类型成为类的参数:
注意,
的类型是
,不能分配给
即
。
破弯
对于任意Arity,这是不可能的,因为类型T => U的函数是Function1 [U,T]的实例,类型(T,U)=> V的函数是Function2 [T,U, V]。 (此外,我找不到任何有用的用例)。 但是,有一个聪明的概念叫做“ currying”。它包含转换一个带有多个参数的函数,并在一个带有单个参数并返回另一个函数的函数中返回一个值。 这是一个例子:
因此,您现在可以执行d1.run(curriedAdd)。 您还可以使用\“ curried \”方法将非咖喱函数转换为咖喱函数:
辩谷变充
您也许可以提出一些其他这样的高阶函数,它们采用固定Arity但任意(即多态)类型的函数并对其进行运算。 经典的高阶函数例如
还有很多很多。
呢率篓舍烫