scala 如何将函数类型扩展为具有更多参数的函数

tp5buhyn  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(68)

给定一个函数f: Function[A,B],有没有一种通用的方法来生成一个类型为Function2[A, C, B]的函数,它忽略了第二个参数?更通用的方法是,扩展任何函数类型以接受任何数量的被忽略的参数?

yduiuuwa

yduiuuwa1#

我不完全确定为什么你想要这样的东西,但对于固定为2的参数数量,你可以做一些基本的事情,如

def expandF[A, B, C](f: A =>B) : Function2[A, C, B] = 
  (a: A, c: C) => f(a)

字符串
在这种情况下,以下对a的调用仍将返回10

def f1(a: Int) = {
  a + 5
}

val a = expandF(f1)

a(5, "Hello")


通用版本由于以下几个原因而更加困难

  1. Scala 2中函数参数的数量上限为22,因此它永远不会真正通用(Scala 3中取消了这个限制)
  2. Scala的静态严格类型系统在最真实的泛型场景中会开始对此感到恼火。你可以使用_*,它允许你传递一个参数集合,但考虑到集合是同构的,你将被限制为一个跨参数的类型。
    这就是使用Shapeless进行泛型编程的地方。你可以使用shapeless对arity进行抽象,参见链接的问题。
    How can I use Shapeless to create a function abstracting over arity
    然后定义一个像上面这样的expand函数,它从一元函数构造这些变量函数之一。
    如果不知道它的确切用途和用例,就很难找到一种适合所有情况的方法。根据您希望如何应用此转换,您甚至可能需要编写一个宏。

相关问题