1. 一阶类型用一阶函数来实现
List是一个类型构造器,接受一个proper type参数,生成一个proper type
class List[T] // 一阶类型
List: (T) => List[T] // 一阶函数
* -> * // kind表示
2. 高阶类型用高阶函数来实现
List2是一个高阶函数,接受一个类型构造器,生成一个proper type
class List2[C[_]] // 高阶类型
List2: (T => C[T]) => List2[C]
(* -> *) -> * // kind表示
3. 实例1
// 定义一个高阶函数,带类型构造器的泛型类型
def foo[M[_]](f: M[Int]) = f
foo[List](List(1,2,3)) // 带类型参数,指定具体类型
foo(List(1,2,3)) // 省略类型参数,具体类型交给编译器推断
4. 实例2
foo((x: Int) => println(x)) // 修改函数参数,使其通过编译
- 使用高阶类型表示函数参数
(x: Int) => println(x)相当于匿名函数,类型为Int => Unit- 匿名函数Int => Unit相当于输入参数为1的函数,类型为Function1[Int, Unit],输入类型需要抽象,即Function[Y, Unit]
- 对于Function[Y,Unit],类型参数有两个,而foo函数仅1个类型参数,需要对Function1进行封装,仅暴露1个参数类型给foo,
({type X[Y] = Function1[Y, Unit]})#X
type X[Y] = Function1[Y, Unit]中的X[Y]表示类型别名
({type X[Y] = Function1[Y, Unit]})#X表示定义了一个结构类型(匿名类),使用类型投影(…)#X调用其中的类型X
foo[ ( { type X[Y] = Function1[ Y,Unit ] })#X ]((x: Int) => println(x))
相似的,在类型声明中可以使用结构类型定义一个临时类型X,并使用类型投影(…)#X调用这个临时类型X