如何定义函数 myEval(f, args)
在 Scala 中,它将另一个函数作为输入 f
和参数 args
其输出为 f(args)
?
我不要myEval
对 f
的数量或参数类型有任何先验知识.
为什么这很有用?这是解决实现泛型问题的一种方法 timeMyFunction(f, args)
方法。如果有办法通过某种惰性 val 构造来做到这一点,那也会很有趣。
编辑 :实现计时方法的更好方法在 this question 中说明.调用 timeMyFunction( { f(args) } )
,函数调用被包裹在一个匿名函数中 Unit => Unit
.所以timeMyFunction
只需要采用 0-arity 函数。
编辑 2 :请参阅 Dirk 的回答,以了解通过传递 f
来避免匿名函数的更有效方法。引用。
所以我对这个问题的理由现在纯粹是我的 Scala 教育。
最佳答案
在大多数情况下,Scala 标准库不会帮助您对元数进行泛化,但是 Shapeless非常适合这个。以下是在 Shapeless 1.2.4 中编写函数的方法:
import shapeless._
def foo[F, P <: Product, A <: HList, R](f: F, p: P)(implicit
fl: FnHListerAux[F, A => R],
pl: HListerAux[P, A]
): R = fl(f)(pl(p))
进而:
scala> foo((i: Int, s: String) => s * i, (3, "a"))
res0: String = aaa
它看起来很复杂,但本质上你只是说你需要证据证明函数
f
可以从异构列表中将一些任意元数转换为单参数函数 A
结果R
,以及元组 P
可以转换为相同类型的异构列表。
关于Scala:如何定义输入为 (f, args) 且输出为 f(args) 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23080245/