一阶参数多态和一阶函数

时间:2011-03-19 15:42:33

标签: scala functional-programming lambda-calculus

我正在阅读论文Generics of a Higher Kind,第一句话是

  

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

我不知道什么是一阶参数多态,我也不太明白什么是一阶函数,我知道高阶函数是一个函数,它接受一个函数并返回一个函数,但我不知道什么是零阶函数,一阶函数。 我在here看到了一个解释,如下:

  

f - > g是零级的顺序 - f - > g - >   h是第一顺序
f - > g - > h - >一世   是二阶的等等。

有人可以为我解释这两个词吗?

1 个答案:

答案 0 :(得分:6)

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

您可能想知道为什么有这样的功能会有用吗?他们允许人们表达更高级别的抽象和更通用的代码,如Monads&函子。标准Haskell98支持更高级别的多态性。

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

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

同样的“仅一个参数”也适用于类型,种类,种类(具有种类的种类)功能。