在DAML中,可以使用类似map的函数来迭代收缩列表,检索它们并对每个收缩执行选择吗?在DAML中,这似乎受到了限制,因为在执行选择时,所有内容都需要包装在单个更新中。
下面是我尝试过的一个例子(注意问题):
exerciseChoice: ContractId ContractB -> Update (ContractId ContractB)
exerciseChoice contractB = do (exercise contractB UpdateB with newText = "test")
template ContractA
with
party : Party
contracts: [ContractId ContractB]
where
signatory party
controller party can
nonconsuming UpdateA : [Update (ContractId ContractB)]
with newText : Text
do
-- a <- create ContractB with party = party; text = newText
-- a2 <- exerciseChoice a
-- return [a2] #these lines work fine
return map exerciseChoice contracts
-- #this doesn't work due to DAML implicitly adding Update before return definition
-- i.e. DAML expects type 'Update [Update (ContractId ContractB)]' based on this signature
-- we need a function which converts something like:
-- '[Update (ContractId ContractB)] -> Update [ContractId ContractB]'
template ContractB
with
party : Party
text: Text
where
signatory party
controller party can
UpdateB: ContractId ContractB
with newText: Text
do create this with text = newText如果这个问题可以解决,您还能解释为什么在DAML中返回多个元组时,它们似乎隐式地从(Update (ContractId A), Update (ContractId B))转换为Update (ContractId A, ContractId B)吗
发布于 2019-09-23 14:51:38
函数map的类型为(a -> b) -> [a] -> [b],因此map exerciseChoice contracts的类型为[Update (ContractId ContractB)]。从概念上讲,将操作列表转换为单个操作很简单。结果操作是按顺序执行列表中的每个操作的操作。实际上,有一个函数可以做到这一点:sequence : (Applicative m) => [m a] -> m [a]。Update是一种应用程序,因此您可以编写sequence (map exerciseChoice contracts)。然而,这是一个如此常见的任务,以至于有一个专门的函数mapA : (Applicative m) => (a -> m b) -> [a] -> m [b]。
mapA exerciseChoice contracts应该可以做到这一点。
https://stackoverflow.com/questions/58056832
复制相似问题