加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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可以被转换到相同类型的异构列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读