exp*_*xpz 8 generics scala lazy-evaluation
如何myEval(f, args)在Scala中定义一个函数,它将另一个函数f和参数作为输入args,其输出是f(args)什么?
我不想myEval拥有关于arity或argument类型的任何先验知识f.
为什么这有用?这是解决实现泛型timeMyFunction(f, args)方法问题的一种方法.如果有办法通过某种懒惰的val构造来做到这一点,那也会很有趣.
编辑:在这个问题中解释了实现计时方法的更好方法.通过调用timeMyFunction( { f(args) } ),函数调用包含在匿名函数中Unit => Unit.所以timeMyFunction只需要采用0-arity函数.
编辑2:请参阅Dirk的回答,这可能是一种更有效的方法,可以f通过引用传递来避免匿名函数.
所以我对这个问题的理由现在纯粹是我的Scala教育.
在大多数情况下,Scala标准库不会帮助您对arity进行概括,但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))
Run Code Online (Sandbox Code Playgroud)
然后:
scala> foo((i: Int, s: String) => s * i, (3, "a"))
res0: String = aaa
Run Code Online (Sandbox Code Playgroud)
它看起来很复杂,但基本上你只是说你需要证据证明f某个任意arity 的函数可以从异构列表转换为单个参数函数A到结果R,并且元组P可以转换为异构列表相同类型.
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |