gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:01:47 24 4
gpt4 key购买 nike

如何定义函数 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com