OCaml 中的数组操作

发布于 2024-11-18 05:07:25 字数 452 浏览 3 评论 0原文

我正在 OCaml 中操作二维数组。我有一些问题:

  1. 如何声明长度为 int64 类型的数组,而不是 int?例如,Array.make : int -> '一-> '一个数组,如果我需要一个索引为 int64 类型的更大数组怎么办?

  2. 我可以写如下内容吗:

    让 array = Array.make_matrix 10 10 0 中 数组。(1).(2) <- 5;数组。(3).(4) <- 20; (* 我修改了数组中的部分值) f 数组... ... 上面的代码在我看来不自然,因为我们修改了 let 内的 array 的值,我是否必须这样做,或者是否有更自然的方法来做到这一点?

有人可以帮忙吗?非常感谢!

I am manipulating 2-dimensional arrays in OCaml. I have some questions:

  1. How to declare an array whose length is of type int64, instead of int? For instance, Array.make : int -> 'a -> 'a array, what if I need a bigger array whose index is of type int64?

  2. May I write something like the following:

    let array = Array.make_matrix 10 10 0 in
    array.(1).(2) <- 5; array.(3).(4) <- 20; (* where I modify a part of values in array)
    f array ...
    ...
    The code above seems to me unnatural, because we modify the value of array inside the let, do I have to this, or is there a more natural way to do this?

Could anyone help? thank you very much!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月亮邮递员 2024-11-25 05:07:25

在 64 位系统上,Array 模块中的 OCaml 数组的大小限制为 2^54 - 1,在 32 位系统上,限制为 4,194,303。对于浮点数组,该限制要小 2 倍。在这两种情况下,索引都很容易表示为 int,因此使用 int64 作为索引没有任何优势。

对于某些问题来说,32 位系统的值太小,因此有另一个名为 Bigarray 的模块可以表示更大的数组。它支持更大的数组,但索引仍然是 int。如果您确实需要较大的索引,那么您可能使用的是 64 位系统,而这并不是一个限制。如果没有,我认为无论如何你都会耗尽地址空间。也许您真正想要的是哈希表?

我不确定你所说的“让”是什么。 let 的目的是给某物命名。在开始向数组存储值之前给数组命名并不是没有道理的。如果要在创建数组时定义值,可以使用 Array.init 并编写任意函数来设置数组值。

OCaml 中的数组代码本质上是命令式的,因此您通常会得到具有这种外观的代码。我经常使用 beginend 并且拥抱它的 Algolic 品质。

On 64-bit systems, the size of OCaml arrays from the Array module is limited to 2^54 - 1 and on 32-bit systems the limit is 4,194,303. For arrays of float, the limit is 2 times smaller. In both cases the index is easily represented as an int, so there's no advantage in using int64 as an index.

The value for 32-bit systems is way too small for some problems, so there is another module named Bigarray that can represent larger arrays. It supports much larger arrays, but the indices are still int. If you really need to have large indices, you are possibly on a 64-bit system where this isn't such a limitation. If not, you're going to run out of address space anyway, I would think. Maybe what you really want is a hash table?

I'm not sure what you're saying about "let". The purpose of let is to give something a name. It's not unreasonable to give the array a name before you start storing values into it. If you want to define the values at the time you create the array you can use Array.init and write an arbitrary function for setting the array values.

Array code in OCaml is inherently imperative, so you will usually end up with code that has that look to it. I often use begin and end and just embrace the Algolic quality of it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文