如何提取一个政党的名字?

时间:2019-01-10 16:46:53

标签: daml

在DAML合同中,如何从“派对”字段中提取派对名称?

当前,toText p给了我Party(Alice)。我只想保留聚会的名字。

1 个答案:

答案 0 :(得分:3)

如果您关心结果字符串的精确格式,则表明您正在DAML中实现编解码器。作为一般原则,DAML擅长于使用建模/合同语言,但其功能有限,无法支持该问题所暗示的面向IO的工作。通常,最好返回DAML值,并在Java / Scala / C#/ Haskell / etc中通过Ledger API与DAML接口实现编解码器。

不过,一旦有了Text值,您就可以通过List访问标准的unpack操纵函数,因此将"Party(Alice)"转换为"Alice"是不太困难:

daml 1.0 module PartyExtract where

import Base.List

def pack (cs: List Char) : Text =
  foldl (fun (acc: Text) (c: Char) -> acc <> singleton c) "" cs;

def partyToText (p: Party): Text =
  pack $ reverse $ drop 2 $ reverse $ drop 7 $ unpack $ toText p

test foo : Scenario {} = scenario
  let p = 'Alice'
  assert $ "Alice" == partyToText p

在DAML 1.2中,标准库已得到扩展,因此上面的代码可以简化:

daml 1.2
module PartyExtract2
where

import DA.Text

traceDebug : (Show a, Show b) => b -> a -> a
traceDebug b a = trace (show b <> show a) $ a

partyToText : Party -> Text
partyToText p = dropPrefix "'" $ dropSuffix "'" $ traceDebug "show party: " $ show p

foo : Scenario ()
foo = do
  p <- getParty "Alice"
  assert $ "Alice" == (traceDebug "partyToText party: " $ partyToText p)

注意:我已离开定义并调用traceDebug,因此您可以在方案跟踪输出中看到正在生成的确切字符串。