Что такое более высокий тип kinded в Scala?



Вы можете найти на сайте:





  1. выше kinded type = = конструктор типов?




    class AClass[T]{...} // For example, class List[T]



    некоторые говорят, что это более высокий тип kinded, потому что он
    рефераты по типам, которые будут соответствовать определению.




    высшее kinded типов типы, которые принимают другие типы и построить новый тип




    Они, хотя также известны как конструктор типа. (Например, в программирование в Scala).




  2. Higher kinded type = = конструктор типа, который принимает конструктор типа в качестве параметра типа?



    в статье дженерики высшего рода вы можете узнать




    ... типы, которые абстрагируются от типов, которые абстрагируются от типов
    (выше-kinded типов) ..."




    что свидетельствует о это




    class XClass[M[T]]{...} // or

    trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]]



    высшее тип kinded.




поэтому, имея это в виду, трудно отличить конструктор типа,высшее kinded типа и конструктор типов, который принимает конструкторы типов в качестве параметра типа, поэтому вопрос выше.

672   4  

4 ответов:

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

конструктор типа-это тип, который можно применить к аргументам типа для "построения" типа.

конструктор значений-это значение, которое можно применить к аргументам значений для "построения" значения.

конструкторы значение обычно называется "функции"или " методы". Эти " конструкторы "также называются" полиморфными "(потому что они могут быть использованы для создания" материала "различной" формы") или" абстракциями " (поскольку они абстрагируются от того, что варьируется между различными полиморфными экземплярами).

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

интерпретация первого порядка вышеуказанных характеристик абстракций:

конструктор типов-это тип, который можно применить к соответствующим аргументам типа, чтобы "построить" правильный тип.

конструктор значений-это значение, которое можно применить к аргументам правильного значения для "построения" правильного значения.

чтобы подчеркнуть, что нет никакой абстракции (я думаю, вы могли бы назвать это "нулевым порядком", но я не видел, чтобы это использовалось где-либо), например значение 1 или типа String, мы обычно говорим, что что-то является" правильным " значением или типом.

правильное значение "немедленно используется" в том смысле, что оно не ждет аргументов (оно не абстрактно над ними). Думайте о них как о значениях, которые вы можете легко распечатать / проверить (сериализация функции-это обман!).

правильный тип-это тип, который классифицирует значения (включая конструкторы значений), конструкторы типов делают не классифицируйте значения (они сначала должны быть применены к правильным аргументам типа, чтобы получить правильный тип). Чтобы создать экземпляр типа, необходимо (но не достаточно), чтобы он был правильным типом. (Это может быть абстрактный класс или класс, к которому у вас нет доступа.)

"высший порядок" - это просто общий термин, который означает повторное использование полиморфизма/абстракции. Это означает то же самое для полиморфных типов и значений. Конкретно, абстракция более высокого порядка абстрагируется что-то, что абстрагируется от чего-то. Для типов термин " высший род "является специальной версией более общего"высшего порядка".

таким образом, версия более высокого порядка нашей характеристики становится:

конструктор типа-это тип, который можно применить к аргументам типа (правильные типы или конструкторы типов), чтобы "построить" правильный тип (конструктор).

конструктор значений-это значение, которое можно применить к аргументам значений (правильные значения или конструкторы значений), чтобы "построить" правильное значение (конструктор).

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, но вы можете использовать структурные типы без слишком больших синтаксических накладных расходов (the -стиль обусловлен 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

(на личной ноте, я сожалею, что когда-либо говорил о "высших добрых типах", они просто типы В конце концов! Когда вам абсолютно необходимо устранить неоднозначность, я предлагаю сказать такие вещи, как " type constructor parameter", "type constructor member" или "Type constructor alias", чтобы подчеркнуть, что вы говорите не только о правильных типах.)

ps: чтобы еще больше усложнить ситуацию, "полиморфный" неоднозначен по-другому, поскольку полиморфный тип иногда означает универсально количественный тип, такой как Forall T, T => T, который является правильным типом, так как он классифицирует полиморфные значения (в Scala это значение может быть записано как структурный тип {def apply[T](x: T): T = x})

(этот ответ является попыткой украсить ответ Адриана Мавра некоторой графической и исторической информацией.)

более высокие типы kinded являются частью Scala с 2.5.

  • до этого Scala, как Java до сих пор, не позволял использовать конструктор типов ("дженериков" в Java) для использования в качестве введите параметр в конструктор типов. например,

     trait Monad [M[_]]
    

    не удалось.

    в Scala 2.5 система типов была расширенная возможность классификации типы на более высоком уровне (известный как тип конструктора полиморфизм). Эти классификации известны как виды.

    Type and  kind realtion, **derived** from "Generics of a Higher Kind" (Изображение получено из дженерики высшего рода)

    следствием является, что конструктор типа (например List) можно использовать так же, как и другие типы в положении параметра типа конструкторов типов и т. д они стали первыми классными типами с Scala 2.5. (Подобный функции, которые являются значениями первого класса в Scala).

    в контексте типа системы поддерживая более высокие виды, мы можем отличить соответствующего типа, вроде Int или List[Int] из типов первого порядка, таких как List и типы высшего вида как Functor или Monad (типы, которые абстрагируются от типов, которые абстрагируются от типов).

    система типов Java с другой стороны не поддерживает виды и поэтому не имеет типов из "высший вид".

    так что это должно быть видно на фоне системы поддержки типа.

  • в случае Scala вы часто видите примеры конструктора типа, например

     trait Iterable[A, Container[_]]
    

    с заголовком "более высокие типы kinded", например в Scala для универсальных программистов, раздел 4.3

    это иногда missleading, потому что многие ссылаются на Container как высшее kinded типа, а не Iterable, но что более точно,

    использование Container как параметр конструктора типа более высокого типа (более высокого порядка) здесь Iterable.

The вид простых типов, таких как Int и Char, экземпляры которого являются ценности, составляет *. Вид конструкторов унарного типа, таких как Maybe - это * -> *; бинарные конструкторы типа Either у (Карри) вида * -> * -> * и так далее. Вы можете просматривать такие типы, как Maybe и Either как функции уровня типа: они принимают один или несколько типов и возвращают тип.

функции высшего порядка если он имеет ордер больше 1, где порядок (неофициально) глубина вложенности, слева, стрелок функции:

  • заказать 0: 1 :: Int
  • заказ 1: chr :: Int -> Char
  • порядок 2: fix :: (a -> a) -> a,map :: (a -> b) -> [a] -> [b]
  • порядок 3: ((A -> B) -> C) -> D
  • заказ 4: (((A -> B) -> C) -> D) -> E

Итак, короче говоря, a выше-kinded тип-это просто тип-уровень более высокого порядка функция.

  • заказать 0: Int :: *
  • заказ 1: Maybe :: * -> *
  • порядок 2: Functor :: (* -> *) -> Constraint - higher-kinded: преобразует конструкторы унарного типа В ограничения класса

Я бы сказал: более высокий kinded типа авторефераты по конструктор типа. Например, рассмотрим

trait Functor [F[_]] {
   def map[A,B] (fn: A=>B)(fa: F[A]): F[B]
}

здесь Functor является "более высоким типом kinded" (как используется в статье "дженерики более высокого рода"). Это не конкретный ("первого порядка") тип конструктора, как List (который абстрагируется только над правильными типами). Он абстрагируется от всех унарных ("первого порядка") конструкторов типа (как обозначается с F[_]).

или говоря по-другому: в Java у нас есть четко введите конструкторы (например,List<T>), но у нас нет "высших добрых типов", потому что мы не можем абстрагироваться от них (например, мы не можем написать Functor интерфейс определено выше - по крайней мере, не напрямую).

термин " полиморфизм более высокого порядка (конструктора типов) "используется для описания систем, поддерживающих"более высокие типы kinded".

Comments

    Ничего не найдено.