解读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]
上面定义了一个函数,里面有三种类型:A
,B
,C
。然后是这部分:
(a: A, f: (A, B) => C
这是foo
函数的参数列表。它包含两个参数,分别是a
和f
。其中,参数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
如上所示,我们把类型A
,B
,C
具体指定为了Int
,String
,Char
。以上是对Scala的模版一个使用的体会。
参考资料: