Вид против ранга в теории типов

Мне трудно понять типы Higher Kind vs Higher Rank. Вид довольно прост (спасибо за это литературе по Haskell), и я раньше думал, что ранг похож на вид, когда речь идет о типах, но, по-видимому, это не так! Я прочитал статью в Википедии безрезультатно. Так может кто-нибудь объяснить, что такое ранг? и что подразумевается под Высшим Рангом? Полиморфизм более высокого ранга? как это относится к видам (если они есть)? Сравнение Scala и Haskell тоже было бы здорово.


person Ashkan Kh. Nazary    schedule 09.11.2012    source источник


Ответы (1)


Понятие ранга на самом деле не связано с понятием видов.

Ранг полиморфной системы типов описывает, где forall могут появляться в типах. В системе типов ранга 1 forall могут появляться только на самом внешнем уровне, в системе типов ранга 2 они могут появляться на одном уровне вложенности и так далее.

Так, например, forall a. Show a => (a -> String) -> a -> String будет типом ранга 1, а forall a. Show a => (forall b. Show b => b -> String) -> a -> String будет типом ранга 2. Разница между этими двумя типами заключается в том, что в первом случае первым аргументом функции может быть любая функция, которая принимает один отображаемый аргумент и возвращает строку. Таким образом, функция типа Int -> String будет допустимым первым аргументом (например, гипотетическая функция intToString), так же как и функция типа forall a. Show a => a -> String (например, show). Во втором случае допустимым аргументом будет только функция типа forall a. Show a => a -> String, т. е. show подойдет, а intToString — нет. Как следствие, следующая функция будет допустимой функцией второго типа, но не первого (где ++ должно представлять конкатенацию строк):

higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)

Обратите внимание, что здесь функция f применяется к (потенциально) трем различным типам аргументов. Итак, если бы f была функцией intToString, это бы не сработало.

И Haskell, и Scala имеют ранг-1 (поэтому указанная выше функция не может быть написана на этих языках) по умолчанию. Но GHC содержит языковое расширение, позволяющее включить полиморфизм ранга 2, и еще одно, позволяющее включить полиморфизм ранга n для произвольного n.

person sepp2k    schedule 10.11.2012
comment
разве мы не можем сказать, что ранги определяют переменные типа, а виды определяют константы типа? - person didierc; 30.01.2013
comment
@didierc Я не совсем понимаю, что вы имеете в виду, но я так не думаю. И переменные типа, и константы типа имеют виды. - person sepp2k; 30.01.2013
comment
Вы можете легко кодировать типы с более высоким рейтингом в scala. См. cs.ox.ac.uk/jeremy.gibbons/publications /scalagp.pdf, раздел 7.2. - person Tony K.; 16.05.2014