【发布时间】:2014-04-15 09:52:25
【问题描述】:
如何在 Scala 中定义一个函数 myEval(f, args),它将另一个函数 f 和参数 args 作为输入,其输出是 f(args)?
我不希望myEval 对f 的arity 或参数类型有任何先验知识。
为什么这很有用?这是解决实现通用timeMyFunction(f, args) 方法问题的一种方法。如果有办法通过某种惰性 val 构造来做到这一点,那也会很有趣。
编辑:在this question 中解释了实现计时方法的更好方法。通过调用timeMyFunction( { f(args) } ),函数调用被包装在匿名函数Unit => Unit 中。所以timeMyFunction只需要取0-arity函数即可。
编辑 2:请参阅 Dirk 的回答,了解通过引用传递 f 来避免匿名函数的更有效方法。
所以我提出这个问题的理由现在纯粹是我的 Scala 教育。
【问题讨论】:
-
答案不多,但通常是 timeMyFunction is written in a bit different way(是的,它适用于任意数量的函数)
-
我尝试编写 timeMyFunction 是基于您发布的链接,但您必须为每个 arity 制作不同的版本,至少以我幼稚的方式。
-
而不是为其指定函数和参数,您应该提供一个完整的块(例如:而不是
timeMyFunction(f, args),timeMyFunction(f(args)),其中 timeMyFunction 签名在 om-nom-nom 提供的链接中) -
谢谢!所以看起来我将 f 包装在一个不带参数的匿名函数中,然后我可以使用 time 函数。
标签: scala generics lazy-evaluation