我很确定他们不一样.然而,我陷入了困境

据我所知, rust 有are种更高级的类型,至少是最基本的类型.使用"*"符号,HKT的确有一种类型,例如* -> *.

data Maybe a = Just a | Nothing

在这里

  • Maybe是类型构造函数,需要应用于具体类型
  • Just aNothing是数据构造函数.

在关于哈斯凯尔的教科书中,这经常被用作更高级类型的例子.然而,在Rust中,它可以简单地实现为一个枚举,它毕竟是一个sum type:

enum Maybe<T> {
    Just(T),
    Nothing,
}

区别在哪里?据我所知,这是一个

  1. 如果在哈斯凯尔,这被用作HKTs的教科书示例,为什么
  2. 应该说 rust 不支持HKT吗?
  3. HKT和参数多态性的根本区别是什么?

当我看函数时,这种困惑还在继续,我可以写一个参数化的

fn do_something<T>(input: Maybe<T>) {
    // implementation
}

再说一次,在哈斯凯尔,这大概是

do_something :: Maybe a -> ()
do_something :: Maybe a -> ()
do_something _ = ()

这就引出了第四个问题.

  1. 对更高级类型的支持到底在哪里结束?有什么问题

Related Questions:

我看了很多与这个话题相关的问题(包括他们与博客帖子的链接等),但我找不到我主要问题(1和2)的答案.

  1. 100
  2. 100
  3. 100
  4. 100
  5. 100

Update

谢谢你给出了很多很好的答案,这些答案都非常详细,帮助很大.我决定接受安德烈亚斯·罗斯伯格的回答,因为他的解释最有助于我走上正轨.特别是关于术语的部分.

我真的陷入了这样一个循环,认为所有的* -> * ... -> *都是higher-kinded.强调* -> * -> *(* -> *) -> *之间区别的解释对我来说至关重要.

推荐答案

一些术语:

  • *型有时被称为ground型.你可以把它看作是第0阶.
  • 任何带有至少一个箭头的表格* -> * -> ... -> *都是first-order.
  • higher-order类是指"左边有嵌套箭头",例如(* -> *) -> *.

order本质上是箭头左侧嵌套的深度,例如,(* -> *) -> *是二阶,((* -> *) -> *) -> *是三阶,等等(FWIW,同样的概念也适用于类型本身:二阶函数是一个其类型具有例如(A -> B) -> C形式的函数)

Types of non-ground kind (order > 0) are also called type constructors (and some literature only refers to types of ground kind as "types"). A higher-kinded type (constructor) is one whose kind is higher-order (order > 1).

因此,一种更高的类型是接受非基础类型的论证的类型.这将需要非地面类型的类型变量,这在许多语言中都不受支持.哈斯克尔的例子:

type Ground = Int
type FirstOrder a = Maybe a  -- a is ground
type SecondOrder c = c Int   -- c is a first-order constructor
type ThirdOrder c = c Maybe  -- c is second-order

后两种是更高级的.

同样地,higher-kinded polymorphism描述了(参数化)多态值的存在,这些多态值在非接地类型上进行了抽象.同样,很少有语言支持这一点.例子:

f : forall c. c Int -> c Int  -- c is a constructor

Rust支持参数多态性而不是更高级类型的说法毫无意义.两者都是相互补充的不同参数化维度.当你把两者结合在一起,你就有了更高的多态性.

Rust相关问答推荐

SQL x中的mut *transaction和mut transaction有什么区别?

如何优化小型固定大小数组中的搜索?

PyReadonlyArray2到Vec T<>

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

为什么Rust函数的移植速度比C++慢2倍?

带参考文献的 rust 元组解构

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

为什么TcpListener的文件描述符和生成的TcpStream不同?

我无法理解Rust范围的定义(Rust Programming Language,第二版克拉布尼克和尼科尔斯)

rust中的库插件管理器,现在是否可行?

使用启用优化的 alloc 会导致非法指令崩溃

信号量释放后 Rust 输出挂起线程

Boxing 如何将数据从堆栈移动到堆?

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

Rust 中的 Option as_ref 和 as_deref 有什么不同

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

Rust 中的方法调用有什么区别?

哪些特征通过 `Deref` 而哪些不通过?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题