正如大多数人可能知道你可以用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'变体?
答案 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)