Позвольте мне восполнить некоторые из этих недоразумений, объясняя это неоднозначностью. Мне нравится использовать аналогию с уровнем стоимости, чтобы объяснить это, поскольку люди, как правило, лучше знакомы с ней.
Конструктор типа - это тип, который можно применять к аргументам типа для «конструирования» типа.
Конструктор значения - это значение, которое можно применить к аргументам значения, чтобы «создать» значение.
Конструкторы значений обычно называются «функциями» или «методами». Эти «конструкторы» также называются «полиморфными» (потому что они могут использоваться для конструирования «вещей» различной «формы») или «абстракций» (поскольку они абстрагируются от того, что варьируется между различными полиморфными экземплярами).
В контексте абстракции / полиморфизма первый порядок относится к «одноразовому использованию» абстракции: вы абстрагируетесь над типом один раз, но сам этот тип не может абстрагироваться над чем-либо. Java 5 дженерики первого порядка.
Интерпретация первого порядка вышеуказанных характеристик абстракций:
Конструктор типа - это тип, который можно применить к подходящим аргументам типа, чтобы «создать» правильный тип.
Конструктор значения - это значение, которое можно применить к аргументам правильного значения, чтобы «создать» правильное значение.
Подчеркнем, что здесь нет абстракции (я думаю, вы могли бы назвать это «нулевым порядком», но я нигде не видел, чтобы это использовалось), например, значение 1
или тип String
, мы обычно говорим, что это «правильное» значение или тип.
Подходящее значение «сразу же можно использовать» в том смысле, что оно не ожидает аргументов (оно не абстрагируется от них). Думайте о них как о значениях, которые вы можете легко распечатать / проверить (сериализация функции обманывает!).
Правильный тип - это тип, который классифицирует значения (включая конструкторы значений), конструкторы типов не классифицируют никакие значения (их сначала нужно применить к аргументам правильного типа, чтобы получить правильный тип). Для создания экземпляра типа необходимо (но не достаточно), чтобы это был правильный тип. (Это может быть абстрактный класс или класс, к которому у вас нет доступа.)
«Высший порядок» - это просто общий термин, который означает многократное использование полиморфизма / абстракции. Это означает то же самое для полиморфных типов и значений. Конкретно, абстракция высшего порядка абстрагируется от чего-то, что абстрагируется от чего-то. Для типов термин «более высокий род» является специализированной версией более общего «высшего порядка».
Таким образом, версия нашей характеристики высшего порядка становится:
Конструктор типа - это тип, который можно применять к аргументам типа (правильные типы или конструкторы типов) для «конструирования» правильного типа (конструктора).
Конструктор значения - это значение, которое можно применить к аргументам значения (правильные значения или конструкторы значений), чтобы «построить» правильное значение (конструктор).
Таким образом, «высший порядок» просто означает, что когда вы говорите «абстрагируясь над X», вы действительно это имеете в виду! X
, Что абстрагируется над не теряет свое «право абстракции»: оно может абстрагироваться от все она хочет. (Между прочим, я использую здесь глагол «абстрактный», чтобы означать: опустить что-то, что не является существенным для определения значения или типа, так что оно может быть изменено / предоставлено пользователем абстракции в качестве аргумента .)
Вот несколько примеров (вдохновленных вопросами Лутца по электронной почте) правильных значений и типов первого и высшего порядка:
proper first-order higher-order
values 10 (x: Int) => x (f: (Int => Int)) => f(10)
types (classes) String List Functor
types String ({type λ[x] = x})#λ ({type λ[F[x]] = F[String]})#λ
Где используемые классы были определены как:
class String
class List[T]
class Functor[F[_]]
Чтобы избежать косвенного определения классов, вам нужно как-то выразить функции анонимного типа, которые не могут быть выражены напрямую в Scala, но вы можете использовать структурные типы без слишком больших синтаксических издержек ( #λ
-style из-за https://stackoverflow.com). / users / 160378 / retronym afaik):
В некоторой гипотетической будущей версии Scala, которая поддерживает функции анонимного типа, вы можете сократить эту последнюю строку из примеров до:
types (informally) String [x] => x [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be
(Лично я сожалею, что когда-либо говорил о «типах с более высоким родом», в конце концов, это просто типы! Когда вам абсолютно необходимо устранить неоднозначность, я предлагаю сказать такие вещи, как «параметр конструктора типа», «член конструктора типа»). или «псевдоним конструктора типов», чтобы подчеркнуть, что речь идет не только о правильных типах.)
PS: чтобы еще больше усложнить ситуацию, «полиморфный» неоднозначен по-другому, так как полиморфный тип иногда означает универсально квантифицированный тип, такой как Forall T, T => T
, который является правильным типом, поскольку он классифицирует полиморфные значения (в Scala это значение может быть записывается как структурный тип {def apply[T](x: T): T = x}
)