对于高阶(又名更高种类)参数多态性,所以第一个值有一个类型,如果您将参数类型视为类型函数(类型的函数)的排序,那么类型现在有一个类型,例如IEnumerable<T>
是一个类型函数kind * -> *,当你将一个类型应用到这个类型函数时,你会得到一个 kind *。因此,有了参数类型(类型构造函数)作为类型函数的这种观点,我们可以开始讨论高阶类型函数,一种可以接受/返回类型函数作为参数的类型函数。这被称为更高种类的多态性,它是 Java 和 C# 等语言所缺乏的高度表达类型系统功能。如果您了解 C++ 模板,那么通过模板模板参数(是的模板模板)对此类事物的支持有限但不一致且几乎无用。
您可能想知道为什么拥有这样的功能会有用?好吧,它们允许人们表达更高级别的抽象和更通用的代码,例如 Monads & Functors。标准 Haskell98 支持更高种类的多态性。
对于您的一阶函数示例,首先您必须了解 lambda 演算中的所有函数只接受一个参数,并且示例中的箭头实际上与右侧相关联,因此这就是您实际拥有的:
f -> g 是零阶。f -> (g -> h) 是一阶,函数返回一个函数。f -> (g -> (h -> i)) 是二阶的,函数返回一个函数,该函数返回一个函数。
同样的“仅一个参数”也适用于类型、种类、排序(具有排序的种类)函数。