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")
型 通用版本由于以下几个原因而更加困难
Scala 2中函数参数的数量上限为22,因此它永远不会真正通用(Scala 3中取消了这个限制)
Scala的静态严格类型系统在最真实的泛型场景中会开始对此感到恼火。你可以使用_*,它允许你传递一个参数集合,但考虑到集合是同构的,你将被限制为一个跨参数的类型。 这就是使用Shapeless进行泛型编程的地方。你可以使用shapeless对arity进行抽象,参见链接的问题。 How can I use Shapeless to create a function abstracting over arity的 然后定义一个像上面这样的expand函数,它从一元函数构造这些变量函数之一。 如果不知道它的确切用途和用例,就很难找到一种适合所有情况的方法。根据您希望如何应用此转换,您甚至可能需要编写一个宏。
1条答案
按热度按时间yduiuuwa1#
我不完全确定为什么你想要这样的东西,但对于固定为2的参数数量,你可以做一些基本的事情,如
字符串
在这种情况下,以下对
a
的调用仍将返回10型
通用版本由于以下几个原因而更加困难
_*
,它允许你传递一个参数集合,但考虑到集合是同构的,你将被限制为一个跨参数的类型。这就是使用Shapeless进行泛型编程的地方。你可以使用shapeless对arity进行抽象,参见链接的问题。
How can I use Shapeless to create a function abstracting over arity的
然后定义一个像上面这样的
expand
函数,它从一元函数构造这些变量函数之一。如果不知道它的确切用途和用例,就很难找到一种适合所有情况的方法。根据您希望如何应用此转换,您甚至可能需要编写一个宏。