2

我在看论文Generics of a Higher Kind,第一句话是

在 Java 5 和 C# 2.0 中,一阶参数多态性以泛型的名义被引入到主流的面向对象编程语言中。

我不知道什么是一阶参数多态性,我也不太明白什么是一阶函数,我知道高阶函数是接受一个函数并返回一个函数的函数,但我不知道什么是零-阶函数,一阶函数。我从这里看到了一个解释,如下所示:

f -> g 是零阶
f -> g -> h 是一阶
f -> g -> h -> i 是二阶
等等。

谁能帮我解释一下这两个术语?

4

1 回答 1

6

对于高阶(又名更高种类)参数多态性,所以第一个值有一个类型,如果您将参数类型视为类型函数(类型的函数)的排序,那么类型现在有一个类型,例如IEnumerable<T>是一个类型函数kind * -> *,当你将一个类型应用到这个类型函数时,你会得到一个 kind *。因此,有了参数类型(类型构造函数)作为类型函数的这种观点,我们可以开始讨论高阶类型函数,一种可以接受/返回类型函数作为参数的类型函数。这被称为更高种类的多态性,它是 Java 和 C# 等语言所缺乏的高度表达类型系统功能。如果您了解 C++ 模板,那么通过模板模板参数(是的模板模板)对此类事物的支持有限但不一致且几乎无用。

您可能想知道为什么拥有这样的功能会有用?好吧,它们允许人们表达更高级别的抽象和更通用的代码,例如 Monads & Functors。标准 Haskell98 支持更高种类的多态性。

对于您的一阶函数示例,首先您必须了解 lambda 演算中的所有函数只接受一个参数,并且示例中的箭头实际上与右侧相关联,因此这就是您实际拥有的:

f -> g 是零阶。f -> (g -> h) 是一阶,函数返回一个函数。f -> (g -> (h -> i)) 是二阶的,函数返回一个函数,该函数返回一个函数。

同样的“仅一个参数”也适用于类型、种类、排序(具有排序的种类)函数。

于 2011-03-19T16:16:35.273 回答