如何在Scala中使lambda函数通用?

时间:2013-06-28 20:14:15

标签: function scala generics lambda

正如大多数人可能知道你可以用scala中的两种方式定义函数,有'def'方法和lambda方法......

使'def'类型通用是相当直接的

def someFunc[T](a: T) { // insert body here

我在这里遇到的问题是如何制作以下通用:

val someFunc = (a: Int) => // insert body here

当然a现在是一个整数,但我需要做些什么才能使它成为通用的?

val someFunc[T] = (a: T) =>不起作用,val someFunc = [T](a: T) =>

也不起作用

是否有可能使它们成为通用的,或者我应该坚持使用'def'变体?

4 个答案:

答案 0 :(得分:7)

正如Randall Schulz所说,def不会创建一个函数,而是一个方法。但是,它可以返回一个函数,这样您就可以创建泛型函数,如identity中的Predef函数。这看起来像这样:

def myId[A] = (a: A) => a

List(1,2,3) map myId
// List(1,2,3)

List("foo") map myId
// List("foo")

但请注意,在没有任何类型信息的情况下调用myId会导致Nothing。在上面的情况下,它起作用,因为类型推断使用map的签名,map[B](f: A => B),其中A是列表的类型,B被引用与A相同,因为这是myId的签名。

答案 1 :(得分:3)

我不相信这是可能的。您可以查看以前的帖子了解更多详情:

How can I define an anonymous generic Scala function?

围绕它的唯一方法(作为答案中的一个提及)是扩展类似FunctionX的东西并在类级别使用泛型,然后在覆盖apply函数时使用它。

答案 2 :(得分:2)

我不相信这也是可能的,但我是一个悲观主义者。

http://www.chuusai.com/2012/04/27/shapeless-polymorphic-function-values-1/

编辑:

告诉我这不是你问的问题,但这就是为什么接受的答案不是我认为你要求的,请看链接:

scala> :pa
// Entering paste mode (ctrl-D to finish)

def myId[A] = (a: A) => a

List(1,2,3) map myId
// List(1,2,3)

List("foo") map myId
// List("foo")

// Exiting paste mode, now interpreting.

myId: [A]=> A => A
res0: List[String] = List(foo)

scala> val f1 = myId[Int]
f1: Int => Int = <function1>

scala> val f2 = myId[String]
f2: String => String = <function1>

scala> List(1,2,3) map f2
<console>:10: error: type mismatch;
 found   : String => String
 required: Int => ?
              List(1,2,3) map f2
                              ^

scala> List("foo") map f1
<console>:10: error: type mismatch;
 found   : Int => Int
 required: String => ?
              List("foo") map f1
                              ^

函数值不是多态的,即通用的。

答案 3 :(得分:1)

最接近的是我相信的多态函数:

https://github.com/milessabin/shapeless#polymorphic-function-values