在 DAML 中可以使用什么来代替 Either?

What can be used instead of Either in DAML?

当我使用任一函数创建选择时,无论何时发生错误都意味着它们 returns 值在任一函数的左侧,这将终止整个模板本身,不会进一步处理其他情况执行,如何在 daml 而不是 Either 中执行相同的功能。

如果执行没有进一步进行,则错误 得到处理。此外,不能简单地忽略 Left。考虑这个 DAML 函数:

steps : Bool -> Either Int Bool
steps q = do
  a <- if q then Left 1 else Right "foobar"
  return $ a == "foobar"

a 是一个 Text,只有当 EitherRight 时才会出现。因此,如果 EitherLeft,执行将无法进行到最后一行,因为没有任何内容可分配给 a

仅仅因为您可能会得到 Either Text Text 就改变这种行为是行不通的。所以在这种情况下,变量也只有在 Right.

时才会被绑定

不会改变行为只是因为您删除了变量。例如,

steps2 : Bool -> Either Int Bool
steps2 q = do
  if q then Left 1 else Right "foobar"
  return q

如果语义突然 "just kept going" 因为你消除了一个未使用的变量绑定,那将是难以置信的不一致和混乱。所以它就在 Left 停在那里,就好像 a <- 还在那里一样。

问题是,这不仅仅是关于 Either;这适用于所有 "error-reporting-style" 操作,因为它们都是 all 以 "I don't have a value to bind to your variable" 为特征的,所以执行永远不会在任何 do 中继续进行,即使你使用 "alternative" 到 Either.

如果你想继续执行,你必须就在那里处理错误;换句话说,如果你有一个 Left,如果你想让它继续运行,你必须想出一个 Right,这在任何具有错误报告功能的操作中都是等价的,因为它们 所有 都缺少您必须想出的 a 值。的确,error对所有人的意义就是"I can't come up with a value for your a <- or whatever else you're doing".