gpt4 book ai didi

ponylang - 为 Pony 数组实现 map 函数

转载 作者:行者123 更新时间:2023-12-02 03:32:30 25 4
gpt4 key购买 nike

我一直在研究 Pony 数组,以便更好地理解 Pony,并且想为任何数组编写映射函数。

我说的是现在大多数语言都具有的用于转换集合元素的标准映射函数,如 Clojure 中所示:

(map #(+ 1 %) [1 2 3]) ; => [2 3 4]

但我希望它实际修改给定的数组,而不是返回新的数组。

由于功能原因,我目前的尝试到目前为止遇到了许多错误:

// array is "iso" so I can give it to another actor and change it
let my_array: Array[U64] iso = [1; 2; 3; 4]

// other actor tries to recover arrays as "box" just to call pairs() on it
let a = recover box my_array end // ERROR: can't recover to this capability
for (i, item) in a.pairs() do
// TODO set item at i to some other mapped value
try my_array.update(i, fun(item))? end
end

任何人都知道如何做到这一点

最佳答案

好吧,花了我一段时间,但我成功了。

这是我对正在发生的事情的基本理解(如果我错了,请纠正我)!

第一步是了解我们需要使用别名来更改 Pony 中变量的功能。

因此,为了使 iso 变量可用作盒子,必须通过基本上将其别名化,将其消耗到另一个变量中:

  let a: Array[U64] ref = consume array // array is "iso"
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end

这有效!!

我遇到的另一个问题是我无法对生成的 Array[U64] ref 做太多事情。例如,无法将其传递给任何人。

因此,我将整个内容包装到一个 recover block 中,以便最终得到相同的数组,但作为一个 val (对数组的不可变引用),它是更有用,因为我可以将其发送给其他 Actor :

let result = recover val
let a: Array[U64] ref = consume array
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
a
end

现在我可以将结果发送给任何人!

关于ponylang - 为 Pony 数组实现 map 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54850238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com