Для параметрического полиморфизма высшего порядка (то есть, с более высоким родом), поэтому у первых значений есть тип, у типов теперь есть вид, если вы думаете о параметрическом типе как о типе функции типа (функции типов), например, IEnumerable<T>
является функцией типа вида * -> *, когда вы применяете тип к этой функции типа, вы получаете тип типа *. Таким образом, с этим представлением параметрических типов (конструкторов типов) как функций типов мы можем начать говорить о функциях типов более высокого порядка, функции типов, которые могут принимать / возвращать функции типов в качестве аргументов. Это известно как полиморфизм с более высоким родом, и это очень выразительная функция системы типов, отсутствующая в таких языках, как Java & C #. Если вы знаете о шаблонах C ++, то существует ограниченная, но несовместимая и почти бесполезная поддержка для таких вещей через параметры шаблона шаблона (да, шаблон шаблона).
Вы можете задаться вопросом, почему было бы полезно иметь такую функцию? они позволяют выражать абстракции более высокого уровня и более общий код, такой как Monads & Functors. Стандартный Haskell98 поддерживает полиморфизм с более высоким родом.
Для вашего примера функции первого порядка, сначала вы должны понять, что все функции в лямбда-исчислении принимают только один аргумент, и стрелки в вашем примере на самом деле связаны вправо, так что это то, что у вас есть на самом деле:
f -> g - нулевой порядок.
f -> (g -> h) - первый порядок, функция возвращает функцию.
f -> (g -> (h -> i)) второго порядка, функция возвращает функцию, которая возвращает функцию.
Тот же «только один аргумент» применим и к функциям типа, вида, сортировки (вида с сортировкой).