4

在 DAML 合约中,如何从 Party 字段中提取当事方的名称?

目前,toText p给我Party(Alice). 我只想保留党的名字。

4

1 回答 1

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以便您可以看到在场景跟踪输出中生成的确切字符串。

于 2019-01-11T03:39:24.043 回答