Позвольте мне наверстать упущенное, начав с неоднозначности.Мне нравится использовать аналогию с уровнем значения, чтобы объяснить это, так как люди, как правило, более знакомы с ним.
Конструктор типа - это тип, который можно применять к аргументам типа для «конструирования».тип.
Конструктор значения - это значение, которое можно применять к аргументам значения для «конструирования» значения.
Конструкторы значений обычно называются «функциями» или «методами».,Эти «конструкторы» также называются «полиморфными» (потому что они могут использоваться для конструирования «вещей» различной «формы») или «абстракций» (поскольку они абстрагируются от того, что варьируется между различными полиморфными экземплярами).
В контексте абстракции / полиморфизма первый порядок относится к «одноразовому использованию» абстракции: вы абстрагируетесь над типом один раз, но сам этот тип не может абстрагироваться над чем-либо.Обобщения Java 5 первого порядка.
Интерпретация первого порядка вышеуказанных характеристик абстракций:
Конструктор типа - это тип, который можно применять к соответствующим аргументам типа"создать" правильный тип.
Конструктор значения - это значение, которое вы можете применить к аргументам правильного значения, чтобы "построить" правильное значение.
Чтобы подчеркнуть, что абстракции нетвовлеченный (я думаю, вы могли бы назвать это «нулевым порядком», но я не видел, чтобы это использовалось где-либо), например, значение 1
или тип String
, мы обычно говорим, что это «правильное» значение или тип,
Правильное значение «сразу же можно использовать» в том смысле, что оно не ожидает аргументов (оно не абстрагируется от них).Думайте о них как о значениях, которые вы можете легко распечатать / проверить (сериализация функции обманывает!).
Подходящий тип - это тип, который классифицирует значения (включая конструкторы значений), конструкторы типов не классифицируют никакие значения (их сначала необходимо применить к аргументам правильного типа, чтобы получить правильный тип).Чтобы создать экземпляр типа, необходимо (но не достаточно), чтобы это был правильный тип.(Это может быть абстрактный класс или класс, к которому у вас нет доступа.)
«Высший порядок» - это просто общий термин, который означает многократное использование полиморфизма / абстракции.Это означает то же самое для полиморфных типов и значений.Конкретно, абстракция высшего порядка абстрагируется от чего-то, что абстрагируется от чего-то.Для типов термин «высший род» является специализированной версией более общего «высшего порядка».
Таким образом, версия нашей характеристики высшего порядка становится такой:
Конструктор типа - это тип, который можно применять к аргументам типа (надлежащие типы или конструкторы типов) для конструированияmsgstr "правильный тип (конструктор).
Конструктор значения - это значение, которое можно применить к аргументам значения (правильные значения или конструкторы значений), чтобы" создать "правильное значение (конструктор).
Таким образом, «высший порядок» просто означает, что когда вы говорите «абстрагирование над 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, но вы можете использовать структурные типы без слишком больших синтаксических издержек (#λ
-стиль обусловлен 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}
)