gpt4 book ai didi

scala - 将列表作为单独的函数参数传递

转载 作者:行者123 更新时间:2023-12-04 01:18:57 27 4
gpt4 key购买 nike

我有一个功能 def f(a: Int, b: Int, c: Int, d: Int, ...)我想提供一个连续整数列表作为参数(在单元测试中)。

有没有简洁的供应方式(1 to N).toListf ?由于函数不是def f(x: Int* ) 我不能简单地使用 list: _*list整数列表。

最佳答案

我认为你不能以类型安全的方式在标准 Scala 中做到这一点,但可以使用 Shapeless 做到这一点。图书馆。即使您不在项目中使用此库,您也可以仅将其用于测试范围。

这是代码示例:

import shapeless._
import shapeless.ops.function._
import shapeless.ops.traversable._

def applyToList[F, HL <: HList, R](f: F)(args: List[Any])(implicit
// convert `(T1, T2, ...) => R` to a function from a single HList argument `HL => R`
fnToProduct: FnToProduct.Aux[F, HL => R],
// convert the argument list to the HList, expected by the converted function
toHList: FromTraversable[HL]
): R = {
toHList(args) match {
case Some(hargs) => fnToProduct(f)(hargs)
case None => sys.error("argument list not applicable to function")
}
}

使用它就像这样简单:
def f(a: Int, b: Int, c: Int, d: Int): Any = ???
applyToList(f _)(List(1, 2, 3, 4))

但请注意需要显式 eta 转换 f _ ,因为 Scala 编译器并不真正知道, F是一个函数。

您可以更改定义以返回 Option[R] ,因为在编译时不可能知道提供的 List是否适合该功能。例如,参数列表可能具有不匹配数量的元素。但是如果这是用于单元测试,你也可以抛出一个异常。

关于scala - 将列表作为单独的函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54342771/

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