Как можно оценить одно из двух условий в предложении ʻure`? - PullRequest
0 голосов
/ 11 января 2020

Как передать значения в предложение ensure в виде условия or?

template ABC

ensure (abcd)? (xyz) || (abc)

Возможно ли это сделать (возможно, с другим синтаксисом) для передачи ensure два предиката, любой из которых должен быть оценен?

1 Ответ

2 голосов
/ 12 января 2020

Если вы просто хотите express логическое выражение, для которого любое из двух значений истинно, подойдет ||.

Синтаксис, который вы используете, тем не менее, предполагает, что вас может заинтересовать выражая что-то вроде следующего (в псевдокоде):

if abcd is true
  fail to create the contract if xyz is true
else
  fail to create the contract if abc is true

Предложение ensure принимает в качестве параметра «предикат, который должен быть истинным, в противном случае создание контракта завершится неудачей» (документы здесь ).

Предикат - это просто функция, которая возвращает логическое значение, истинное или ложное.

В отличие от других языков (предлагаемый вами синтаксис указывает на то, что вы знакомый с C, C ++ или Java), в DAML if является выражением, означающим, что оно возвращает значение. Это означает, что вы можете использовать его так же, как и конструкцию <condition> ? <if_true> : <if_false>, скажем, в Java.

. Надеемся, что следующий пример идет в вашу сторону:

daml 1.2
module Main where

template Main
  with
    owner : Party
    cond1 : Bool
    cond2 : Bool
    cond3 : Bool
  where
    signatory owner
    ensure if cond1 then cond2 else cond3 -- HERE!

test = scenario do
  p <- getParty "party"
  submit p do create $ Main p True True False
  submit p do create $ Main p False False True
  submitMustFail p do create $ Main p False True False

Примечание что в зависимости от ситуации вы можете захотеть express того же предложения, что и отдельное условие, используя логические операторы:

ensure cond1 && cond2 || cond3
...