6

你们中的大多数人可能都知道可以在 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

4 回答 4

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)ABAmyId

于 2013-06-28T22:14:36.743 回答
3

我不相信这是可能的。您可以查看此之前的帖子以获取更多详细信息:

如何定义匿名通用 Scala 函数?

解决它的唯一方法(如答案之一所述)是扩展 FunctionX 之类的东西并在类级别使用泛型,然后在apply函数的覆盖中使用它。

于 2013-06-28T20:16:18.723 回答
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
                              ^

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

于 2013-06-28T21:02:27.043 回答
1

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

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

于 2013-06-28T22:00:27.747 回答