Реализация функции карты для массива Pony - PullRequest
0 голосов
/ 24 февраля 2019

Я играл с массивами Pony, чтобы лучше понять Pony, и хотел написать функцию map для любых массивов.

Я говорю о чем-то похожем на стандартную функцию map, которую в настоящее время есть в большинстве языков для преобразования элементовколлекции, как в 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

Кто-нибудь знает, как это можно сделать

1 Ответ

0 голосов
/ 24 февраля 2019

Хорошо, у меня ушло некоторое время, но я смог заставить все работать.

Вот мое базовое понимание того, что происходит (пожалуйста, поправьте меня, если я ошибаюсь)!

Первым шагом было понять, что нам нужно использовать псевдонимы, чтобы изменить возможности переменной в Pony.

Итак, чтобы сделать изо-переменную пригодной для использования в качестве блока, нужно ее псевдоним в основном, потребляяэто в другую переменную:

  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, чтобы получить тот же массив, но в виде val (неизменяемая ссылка намассив), который более полезен, поскольку я могу отправить его другим акторам:

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

Теперь я могу отправить result любому!

...