阿男的小窝

View the Project on GitHub

解读scala的模版定义

解读下面这个模版的定义:

scala> def foo[A,B,C](a: A, f: (A,B) => C): B => C = (b: B) => ???
foo: [A, B, C](a: A, f: (A, B) => C)B => C

首先是这部分:

def foo[A, B, C]

上面定义了一个函数,里面有三种类型:ABC。然后是这部分:

(a: A, f: (A, B) => C

这是foo函数的参数列表。它包含两个参数,分别是af。其中,参数a的类型为A,参数f是一个函数,它的定义是(A, B) => C。也就是说,函数f的参数是两个,分别是一个A类型的参数,和一个B类型的参数。然后函数f的返回值类型是C。然后是foo的具体的定义的部分:

C = (b: B) => ???

这个定义是指一个类型为C的变量,它的值,从一个函数里得到。而这个函数的定义如下:

(b: B) => ???

这个函数定义就是,接受一个类型为B的参数b,然后???就是指具体的实现还没有确定(也就是先不实现)1。所以整个foo的定义是一种抽象的定义。下面是对foo的具体使用:

scala> def _f(x: Int, y: String) = 'x'
_f: (x: Int, y: String)Char

如上所示,首先定义用来作为foo的第二个参数f的函数。然后是调用foo

scala> foo[Int, String, Char](1, _f)
res6: String => Char = $$Lambda$1110/1303849183@b0d3e7

如上所示,我们把类型ABC具体指定为了IntStringChar。以上是对Scala的模版一个使用的体会。

参考资料: