Я уверен, что они не то же самое. Тем не менее, я увяз в общем понимании того, что "Rust не поддерживает" более высокие типы (HKT), но вместо этого предлагает параметрический полиморфизм. Я попытался обвести голову и понять разницу между ними, но все больше и больше запутывался.
Насколько я понимаю, в Rust есть более высокие типы, по крайней мере, основы. Используя "*" -notation, HKT имеет вид eg * → *
. Например, " Maybe
имеет вид * → *
и может быть реализован так же, как в Haskell.
data Maybe a = Just a | Nothing
Вот,
-
Maybe
, это конструктор типов и его нужно применять к конкретному типу, чтобы стать конкретным типом вида "*". -
Just a
иNothing
- конструкторы данных.
В учебниках о Haskell это часто используется в качестве примера для более высокого типа. Однако в Rust он может быть просто реализован как перечисление, которое, в конце концов, является типом суммы:
enum Maybe<T> {
Just(T),
Nothing,
}
Где разница? Насколько я понимаю, это прекрасный пример более высокого рода.
- Если в Haskell это используется как пример учебника HKT, почему говорится, что у Rust нет HKT? Не
Maybe
перечислениеMaybe
квалифицироваться как HKT? - Стоит ли говорить, что Rust не полностью поддерживает HKT?
- Какое фундаментальное различие между HKT и параметрическим полиморфизмом?
Эта путаница продолжается при просмотре функций, я могу написать параметрическую функцию, которая принимает Maybe
, и для моего понимания HKT как аргумент функции.
fn do_something<T>(input: Maybe<T>) {
// implementation
}
снова, в Haskell, что было бы чем-то вроде
do_something :: Maybe a -> ()
do_something :: Maybe a -> ()
do_something _ = ()
что приводит к четвертому вопросу.
- Где именно заканчивается поддержка более высоких типов? Какой минимальный пример, чтобы система типа Rust не могла выразить HKT?
Связанные вопросы:
Я рассмотрел множество вопросов, связанных с темой (включая ссылки, которые у них есть на блог-посты и т.д.), Но я не смог найти ответ на мои основные вопросы (1 и 2).
- В Haskell существуют типы "более высокого типа" * действительно *? Или они просто обозначают коллекции * конкретных * типов и ничего больше?
- Общая структура над родовым типом без параметра типа
- Высшие типы в Scala
- Какие типы проблем помогают "более высокоподобному полиморфизму" решить лучше?
- Абстрактные типы данных против параметрического полиморфизма в Haskell
Обновить
Спасибо за много хороших ответов, которые все очень детализированы и очень помогли. Я решил принять ответ Андреаса Россберга, потому что его объяснение помогло мне больше всего на правильном пути. Особенно о терминологии.
Я был действительно заперт в цикле мышления, что все из рода * → *... → *
является более высокопоставленным. Объяснение, которое подчеркивало разницу между * → * → *
и (* → *) → *
было для меня решающим.