一阶参数多态和一阶函数

Saw*_*yer 2 functional-programming scala lambda-calculus

我正在读报纸Generics of a Higher Kind,第一句是

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

我不知道什么是一阶参数多态,我也不太明白什么是一阶函数,我知道高阶函数是一个函数,它接受一个函数并返回一个函数,但我不知道什么是零 - 订单功能,一阶功能.我从这里看到了一个解释,像这样:

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

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

snk*_*kid 6

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

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

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

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

同样的"仅一个参数"也适用于类型,种类,排序(具有种类的种类)功能.