Scala:如何定义输入为 (f, args) 且输出为 f(args) 的函数?

标签 scala generics lazy-evaluation

如何定义函数 myEval(f, args)在 Scala 中,它将另一个函数作为输入 f和参数 args其输出为 f(args) ?

我不要myEvalf 的数量或参数类型有任何先验知识.

为什么这很有用?这是解决实现泛型问题的一种方法 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/

相关文章:

scala - 为什么 flatMap 链在第一个 Left 值处停止但在 Right 值处继续

scala - 将变长参数传递给期望相同的另一个函数?

java - 我可以限制哪些类可以实现接口(interface)吗?

java - 错误的泛型转换没有 ClassCastException [Java]

haskell - 大多数时候有什么理由不使用 StrictPragma 吗?

haskell - 为什么引入严格性的函数称为 seq?

scala - 声明一种接受未知案例类作为参数的方法,以在 Scala 中的模式匹配中使用它

scala - Apache-Spark 图形框架中的 SBT

Java DAO 工厂动态返回的对象类型

r - 从头开始制作 R promise 对象(懒惰评估)