Scala:如何定义一个输入为(f,args)且输出为f(args)的函数?
发布时间:2020-12-16 08:58:55 所属栏目:安全 来源:网络整理
导读:如何在 Scala中定义一个函数myEval(f,args),它将另一个函数f和参数args作为输入,其输出为f(args)? 我不希望myEval对f的arity或argument类型有任何先验知识. 为什么这有用?这是解决实现通用timeMyFunction(f,args)方法问题的一种方法.如果有办法通过某种懒
如何在
Scala中定义一个函数myEval(f,args),它将另一个函数f和参数args作为输入,其输出为f(args)?
我不希望myEval对f的arity或argument类型有任何先验知识. 为什么这有用?这是解决实现通用timeMyFunction(f,args)方法问题的一种方法.如果有办法通过某种懒惰的val结构来做到这一点,那也会很有趣. 编辑:在this question中解释了实现计时方法的更好方法.通过调用timeMyFunction({f(args)}),函数调用包含在匿名函数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)) 然后: scala> foo((i: Int,s: String) => s * i,(3,"a")) res0: String = aaa 它看起来很复杂,但基本上你只是说你需要证据证明某个任意arity的函数f可以从异构列表A转换为单个参数函数到结果R,并且元组P可以被转换到相同类型的异构列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |