为什么 ocaml 有可变数组?

Why does ocaml have mutable arrays?

为什么 Ocaml 有可变数组?据我了解函数式编程,它是为了尽量减少副作用。可变(编辑:)数组是否与该想法相反?

即使字符串在 Ocaml 中也是可变的,而在 python 中甚至不是这样,或者 OCaml 不被认为是一种纯函数式语言?

OCaml 不是纯函数式语言,没错。它有一个纯函数子集,但支持突变和许多命令式结构(以及可变的 OO 对象)。恕我直言,重点是允许程序员做出必要的权衡,同时为函数式编程提供出色的支持(和一种鼓励)。

正如@AnuragSoni 指出的那样,列表和数组在 OCaml 中是不同的东西。数组是可变的,但列表不是。

在我看来,纯函数数组问题很大。例如,根据我的(微不足道的)经验,它们并未在 Haskell 中广泛使用。是的,它们是纯净的,但对于许多用途来说还不够有效。

是的,可变数组与纯函数式编程背道而驰。但 ocaml 远不止是函数式编程。它还具有许多命令式和面向对象的功能。

与其他数据类型相比,数组具有一项与众不同的主要特征:恒定时间内的随机访问(也称为直接访问)。这包括阅读和写作。如果没有可变数组,就不可能拥有在恒定时间内随机访问写入的数据结构。这对于例如哈希表或堆。

现在拥有不可变数组和可变数组本来是件好事,并且可以使用幻像类型轻松实现这一点,这样一来,需要不可变数组的函数也将接受可变数组,但反之则不行.

但是 ocaml 核心语言在历史上已经发展到包括 ocaml interpreter/compiler 所需的一切,仅此而已。不需要不可变数组,但需要可变数组。因此实现了一个直接的可变数组类型。将它扩展到 mutable/immutable 数组很容易,但这留给了标准库的扩展。

注意:元组是一种不可变数组。但是它们有一个编译时固定大小并且没有索引运算符。

注意 2:ocaml 以可变字符串开头。许多年后,直到最近,它才更改为字节(可变)和字符串(不可变)。遗憾的是没有幻影类型,所以它们不可互换。