20

是否有允许函数文字上的泛型类型参数的语法?我知道我可以将其包装在以下方法中:

def createLongStringFunction[T](): (T) => Boolean = {
  (obj: T) => obj.toString.length > 7
}

但后来我最终需要为每种类型 T 调用该方法并获得一个新函数。我查看了语言参考,虽然我看到编译器将函数文字语法转换为本身具有通用输入类型的Functionn对象的实例,但看起来编译器魔法在创建时实现了这些参数。实际上,我没有找到任何允许我“使Functionn的一个或多个类型参数未绑定”的语法。我更喜欢的是:

// doesn't compile
val longStringFunction: [T](T) => Boolean = (obj: T) => obj.toString.length > 7

有没有这样的事情存在?或者就此而言,当被扩展的方法具有泛型参数时,eta-expansion 函数的显式类型是什么?

这是一个纯粹人为且无用的示例。当然,我可以让函数在这里使用 Any 。

4

4 回答 4

21

不,类型参数仅适用于方法而不适用于函数对象。例如,

def f[T](x: T) = x     //> f: [T](x: T)T
val g = f _            //> g: Nothing => Nothing = <function1>
// g(2)                // error
val h: Int=>Int = f _  //> h  : Int => Int = <function2>
h(2)                   //> res0: Int = 2

该方法f不能转换为多态函数对象g。如您所见,推断的类型g实际上是Function1[Nothing, Nothing],这是没有用的。但是,通过类型提示,我们可以构造h: Function1[Int,Int]出按预期工作的Int参数。

于 2013-03-07T06:58:28.843 回答
8

正如您所说,在您的示例中,您所需要的只是toString方法,因此Any通常是解决方案。List但是,在将类型构造函数应用于元组中的每个元素等情况下,需要能够使用更高级别的类型。

正如其他答案所提到的,对此没有直接支持,但是有一种相对不错的编码方式:

trait ~>[A[_],B[_]] {
  def apply[X](a : A[X]) : B[X]
}

type Id[A] = A //necessary hack

object newList extends (Id ~> List) {
  def apply[X](a : Id[X]) = List(a)
}

def tupleize[A,B, F[_]](f : Id ~> F, a : A, b : B) = (f(a), f(b))

tupleize(newList, 1, "Hello") // (List(1), List(Hello))
于 2013-03-07T09:54:44.967 回答
1

由于longStringFunction定义如下是一个,它必须有一些给定的类型

val longStringFunction: (T) => Boolean = (obj: T) => obj.toString.length > 7

但是,您可以使用方法重用函数对象:

scala> val funObj: Any => Boolean = _.toString.size > 7
funObj: Any => Boolean = <function1>

scala> def typedFunction[T]: T => Boolean = funObj
typedFunction: [T]=> T => Boolean

scala> val f1 = typedFunction[String]
f1: String => Boolean = <function1>

scala> val f2 = typedFunction[Int]
f2: Int => Boolean = <function1>

scala> f1 eq f2
res0: Boolean = true

这是有效的,因为trait Function1[-T1, +R]它是type的逆变T1器。

于 2013-03-07T08:45:33.640 回答
1

在scala中,函数值是参数单态的(而方法是多态的)

Shapeless 库引入了多态函数值,这些函数值可以映射到 HList 和许多其他特性上。

请考虑以下参考:http: //www.chuusai.com/2012/04/27/shapeless-polymorphic-function-values-1/ http://www.chuusai.com/2012/05/10/shapeless-多态函数值-2/

于 2014-12-26T10:15:50.177 回答