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