Параметрический полиморфизм первого порядка и функция первого порядка - PullRequest
2 голосов
/ 19 марта 2011

Я читаю статью Generics of a Higher Kind, первое предложение -

В Java 5 и C # 2.0 параметрический полиморфизм первого порядка был введен в основных объектно-ориентированных языках программирования под названиемgenerics.

Я не знаю, что такое параметрический полиморфизм первого порядка, я также не совсем понимаю, что такое функция первого порядка, я знаю, что функция высокого порядка - это функция, которая принимает функцию и возвращаетфункция, но я не знаю, что такое функция нулевого порядка, функция первого порядка.Я видел объяснение от здесь , вот так:

f -> г нулевой порядокf -> g -> h - первый порядокf -> g -> h -> я второго порядкаИ т.п.

Может кто-нибудь объяснить мне эти два термина?

1 Ответ

6 голосов
/ 19 марта 2011

Для параметрического полиморфизма высшего порядка (то есть, с более высоким родом), поэтому у первых значений есть тип, у типов теперь есть вид, если вы думаете о параметрическом типе как о типе функции типа (функции типов), например, IEnumerable<T> является функцией типа вида * -> *, когда вы применяете тип к этой функции типа, вы получаете тип типа *. Таким образом, с этим представлением параметрических типов (конструкторов типов) как функций типов мы можем начать говорить о функциях типов более высокого порядка, функции типов, которые могут принимать / возвращать функции типов в качестве аргументов. Это известно как полиморфизм с более высоким родом, и это очень выразительная функция системы типов, отсутствующая в таких языках, как Java & C #. Если вы знаете о шаблонах C ++, то существует ограниченная, но несовместимая и почти бесполезная поддержка для таких вещей через параметры шаблона шаблона (да, шаблон шаблона).

Вы можете задаться вопросом, почему было бы полезно иметь такую ​​функцию? они позволяют выражать абстракции более высокого уровня и более общий код, такой как Monads & Functors. Стандартный Haskell98 поддерживает полиморфизм с более высоким родом.

Для вашего примера функции первого порядка, сначала вы должны понять, что все функции в лямбда-исчислении принимают только один аргумент, и стрелки в вашем примере на самом деле связаны вправо, так что это то, что у вас есть на самом деле:

f -> g - нулевой порядок. f -> (g -> h) - первый порядок, функция возвращает функцию. f -> (g -> (h -> i)) второго порядка, функция возвращает функцию, которая возвращает функцию.

Тот же «только один аргумент» применим и к функциям типа, вида, сортировки (вида с сортировкой).

...