Как выполнить код в DAML N раз? - PullRequest
0 голосов
/ 04 февраля 2019

Скажем, у меня есть выбор, который принимает целое число, представляющее счет, и я хочу создать контракт такое количество раз, т.е. выполнить некоторый блок кода столько раз.

Например, в Ruby это может выглядеть так:

n.times do 
  #run some code here
end

Как мне добиться этого в DAML?

1 Ответ

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

TLDR

Чтобы применить операцию бухгалтерской книги N раз, проще всего использовать функцию replicateA из DA.Action.

Пример

daml 1.2
module ReplicateDaml
where

import DA.Action

template Demo
  with
    sig: Party
    total: Int
  where
    signatory sig

testReplicate = scenario do
  p <- getParty "party"
  let
    total = 10

  p `submit` replicateA total $ create Demo with sig=p; total

Обсуждение

Сигнатура типа для replicateA:

-- | `replicateA n act` performs the action n times, gathering the results.
replicateA : (Applicative m) => Int -> m a -> m [a]

Вы можете прочитать это как:

Эта функция поддерживает любой тип m, который имеет экземпляр (реализацию) для класса типов Applicative (API или интерфейс).Его первый параметр - Int Второй - это «эффект» типа m, который предоставляет значение типа a. Он возвращает результат повторения эффекта N раз, собирая результаты в список

Тип create, который вы описываете, имеет тип: Update (ContractId a);и как Update создает (имеет реализацию) класс типов Applicative, вы можете использовать любую функцию, которая работает с Applicative на Update - которая, естественно, включает replicateA.

При использовании этого способа замените Update на m и (ContractId t) на a в сигнатуре типа, так:

replicateA : Int -> Update (ContractId t) -> Update [ContractId t]

...