Как выполнить некоторый код в DAML N раз?

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

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

n.times do 
  #run some code here
end

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


person the1337sauce    schedule 04.02.2019    source источник


Ответы (1)


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]

person Recurse    schedule 05.02.2019