有没有一种 O(1) 方法可以让 Haskell 读取 C 样式数组?

Is There an O(1) Way To Give Haskell Read Access to C-style Arrays?

提问人:James Strieter 提问时间:10/15/2023 更新时间:10/15/2023 访问量:145

问:

我想从 C++ 调用 Haskell 函数:

a = f(x);

其中 f 是 Haskell 函数。

x 在 CPP 中。double[]

无论x发生什么状态突变,都会在C++中发生。例如

x[42] = x[41] + pi;

如果我能让 Haskell 看到,那就太好了.[Double]

每次调用时,我都能想到一些 O(N) 方法来构造一个新的,但我正在寻找一种 O(1) 方式。[Double]f

请注意,只需要读取权限。

有没有 O(1) 方法可以做到这一点?

C++ 数组 列表 Haskell

评论

0赞 user2357112 10/15/2023
您使用的是什么Haskell实现?
6赞 leftaroundabout 10/15/2023
你为什么想让Haskell看到?这显然是数组/向量的情况。即使从已经存在的列表中读取也不是 O(1)。如果你的意思是 O(k),其中 k 是你读入的最高索引,那么这可以通过延迟地将数组转换(流式处理)为列表来实现。[Double]
0赞 Ben 10/15/2023
从根本上说,C 样式数组在内存中看起来不像 Haskell。C 数组只是一个连续的内存块,其中直接包含双精度。Haskell 是指向双精度的指针的链表,因此该类型的 Haskell 函数将通过跟踪指针来读取第 n 个条目。一个 C 样式的数组在被这样的 Haskell 函数读取之前必须转换为这种截然不同的格式,这永远不会是 O(1)。[Double][Double]

答:

4赞 Daniel Wagner 10/15/2023 #1

你所要求的确切的东西,在 O(1) 中是不可能的,除非你愿意开始做摊销 O(1) 式的事情。但作为替代方案,如果出现突变完成的时间点,您可能会喜欢 Data.Vector.Storable,如果没有,则可能喜欢 Data.Vector.Storable.Mutable[Double]

评论

0赞 luqui 10/15/2023
我的意思是。。。这可能以某种方式成为可能。列表中的每个数字都会在内存中有一个地址,所以如果你能找到它,你可以去玩它。这是否在 API 中公开是另一回事......
3赞 Daniel Wagner 10/15/2023
@luqui 如果我理解正确的话,您建议创建一个长度合适的列表,然后使用不安全的黑客来修改该列表中的值以匹配来自C++的数组。如果是这样,那么我相信第一步 - 创建一个正确长度的列表 - 已经不是 O(1)。
0赞 luqui 10/17/2023
该问题提到将多次调用。因此,我的意思是创建一次列表,然后,也许使用数组将索引映射到其相应的内存地址,在每次函数调用之前像数组一样修改它。无论如何,这似乎有点令人费解,但总比“不可能”要好。也许更像是“不建议”。f