How do I make lambda functions generic in Scala? [

2019-02-17 09:43发布

问题:

This question already has an answer here:

  • How can I define an anonymous generic Scala function? 2 answers

As most of you probably know you can define functions in 2 ways in scala, there's the 'def' method and the lambda method...

making the 'def' kind generic is fairly straight forward

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

what I'm having trouble with here is how to make the following generic:

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

of course right now a is an integer, but what would I need to do to make it generic?

val someFunc[T] = (a: T) => doesn't work, neither does val someFunc = [T](a: T) =>

Is it even possible to make them generic, or should I just stick to the 'def' variant?

回答1:

As Randall Schulz said, def does not create a function, but a method. However, it can return a function and this way you can create generic functions like the identity function in Predef. This would look like this:

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

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

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

But be aware, that calling myId without any type information infers Nothing. In the above case it works, because the type inference uses the signature of map, which is map[B](f: A => B) , where A is the type of the list and B gets infered to the same as A, because that is the signature of myId.



回答2:

I don't believe it's possible. You can look at this previous post for more details:

How can I define an anonymous generic Scala function?

The only way around it (as one of the answers mentions) is to extend something like FunctionX and use a generic at the class level and then use that in the override of the apply function.



回答3:

I don't believe it's possible either, but I'm a pessimist.

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

Edit:

Tell me if this isn't what you're asking, but this is why the accepted answer isn't what I thought you were asking for, see the link:

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
                              ^

The function values are not polymorphic, i.e., generic.



回答4:

The closest thing is polymorphic functions I believe:

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