Читая определение полиморфизм в Википедии, у меня возникает вопрос:
Какие типы полиморфизма поддерживаются в Haskell, а какие нет?
Похоже, Википедия не содержит описания некоторых типов полиморфизма, таких как Левитивный полиморфизм, которые являются новыми для меня и поддерживаются в Haskell.
Мне интересно иметь расширенный список Хаскелл Полиморфизм с примерами для более глубокого изучения.
Вроде основных два:
@JosephSible Я уважаю ваш голос. Но ты не убедил меня в том, насколько велик список вещей, которые нужно объяснить.
Причины, по которым я спрашиваю, две: Чтобы глубоко изучить Haskell. Кроме того, я ожидаю аналогичный вопрос на техническом интервью.
Я проголосовал, потому что, вероятно, есть довольно короткий и определенный ответ на этот вопрос, по крайней мере, для конкретной версии GHC. Полиморфизм в целом является довольно абстрактным понятием, но должен существовать конечный список языковых возможностей, реализованных в GHC, которые допускают ту или иную форму полиморфизма, и это конкретный вопрос факта.
Есть как минимум четыре вещи, которые можно считать полиморфизмом в текущем Haskell:
Есть еще два типа полиморфизма, которые мощь будут представлены в будущих версиях Haskell:
Полиморфизм совместимости. Позволит семействам типов более высокого порядка работать как с конструкторами типов, так и с семействами типов в качестве аргументов. Описано в статье Программирование на уровне типов высшего порядка в Haskell.
Полиморфизм кратности. Позволит функциям более высокого порядка работать как с нормальными функциями, так и с линейными функциями в качестве аргументов. Описано в статье Linear Haskell Практическая линейность в полиморфном языке высокого порядка.
Можно спросить, зачем весь этот арсенал полиморфизмов? Кажется, в Haskell существует общий принцип проектирования, согласно которому всякий раз, когда какая-то проблема может быть решена с помощью полиморфизма или подтипа, следует отдавать предпочтение полиморфизму.
Например, из статьи о легкомысленном полиморфизме:
We can now present the main idea of the paper: replace sub-kinding with kind polymorphism.
Из статьи, посвященной полиморфизму совместимости:
At first you might think that we need subtyping, but instead we turn to polymorphism
Из линейной бумаги Haskell:
The lack of subtyping is a deliberate choice in our design
Сам Саймон Пейтон Джонс указывает на 47:00 в этот разговор.
Whenever you want to use subtyping, use polymorphism instead.
Спасибо за ваш ответ. Могу ли я сказать, что полиморфизм более высокого ранга — это частный случай параметрического полиморфизма?
Можно возразить, что подтипирование — это еще один вид полиморфизма. На самом деле подтипы поддерживаются в Haskell с экзистенциальными типами, но их следует использовать с крайней осторожностью.
Полиморфизм более высокого ранга @mkUltra позволяет использовать параметрический/специальный полиморфизм внутри функций, передаваемых в качестве аргументов функциям более высокого порядка, что не включено по умолчанию downloads.haskell.org/~ghc/latest/docs/html/users_guide/…kseo.github.io/posts/2016-12-27-higher-rank-polymorphism.html, а также позволяет использовать типы более высокого ранга downloads.haskell.org/~ghc/latest/docs/html/users_guide/…
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он требует большого списка вещей, а не чего-то, где может быть действительным один ответ или конкретная проблема, которую необходимо решить.