Skip to content

两分钟讲明白高阶类型(HKT)

编程语言辩经常客之高阶类型是什么?

我们知道高阶函数是返回函数的函数,那么字面理解类型就是返回类型的类型。这是什么意思呢?其实很简单,就拿辩经中经常被批斗的Java举例:

java
class List<T> // 这就是一个高阶类型

List是一个接受一个类型(T)返回另一个类型(List<T>)的高阶类型。但我们又知道,老登语言Java是没有高阶类型的,诚然:

java
<T> void foo(List<T> xs) {} // 合法
<F, T> void bar(F<T> xs) {} // 不合法!

F也是一个高阶类型,但是Java却不允许这么表达!我们想要的是:

java
<F<?>, T> void bar(F<T> xs) {}

在Scala中是可以滴:

scala
def foo[F[_], A, B](xs: F[A]): F[B] = ???
// 因此可得
def map[F[_] <: Seq[?], A, B](xs: F[A], f: A => B): F[B] = ???

注意到在Kotlin中,所有Iterable被map之后只能统一返回List而不能保持原来的形状。

Scala赢。