0

如何ensure以条件的形式将值传递给子句or

template ABC

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

是否可以这样做(可能使用其他语法)来传递ensure两个谓词,其中任何一个都必须被评估?

4

1 回答 1

2

如果您只想表达两个值中的任何一个为真的布尔表达式,||就可以了。

但是,您使用的语法表明您可能有兴趣表达以下内容(在伪代码中):

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),在 DAMLif中是一个表达式,这意味着它返回一个值。这意味着您可以像使用<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

请注意,根据具体情况,您可能希望使用布尔运算符将相同的子句表示为单个条件:

ensure cond1 && cond2 || cond3
于 2020-01-12T14:46:03.387 回答