Что можно использовать вместо Либо в DAML?

когда я создаю выбор с помощью любой функции, всякий раз, когда возникает ошибка, означает, что они возвращают значения в левую часть либо, что завершает сам полный шаблон, который не продолжается дальше для выполнения другого сценария, как сделать обе те же функции в дамль вместо Либо.


person arjun a    schedule 16.11.2019    source источник


Ответы (1)


Если выполнение не продолжается дальше, ошибка не обрабатывается. Более того, Left нельзя просто игнорировать. Рассмотрим эту функцию DAML:

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

a — это Text, который присутствует только в том случае, если Either равен Right. Поэтому, если Either равно Left, выполнение не может перейти к последней строке, потому что a нечего присваивать.

Не стоит менять это поведение только потому, что вы можете получить Either Text Text. Так что и в этом случае переменная будет привязана, только если она Right.

Также не стоит менять поведение только потому, что вы удалили переменную. Например,

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

Если бы семантика вдруг «просто продолжила работать» из-за того, что вы удалили неиспользуемую привязку переменной, это было бы невероятно непоследовательно и запутанно. Так что он останавливается прямо там, на Left, как если бы a <- все еще был там.

Дело в том, что речь идет не только о Either; это относится ко всем действиям в стиле "сообщения об ошибках", потому что они все характеризуются фразой "У меня нет значения для привязки к вашей переменной", поэтому выполнение никогда не может продолжаться ни в каком do , даже если вы используете «альтернативу» Either.

Вы должны обработать ошибку немедленно, если хотите продолжить выполнение; другими словами, если у вас есть Left, вам нужно придумать Right, если вы хотите, чтобы он продолжал работать, и это эквивалентно любому действию, которое включает отчеты об ошибках, потому что они все имеют недостающие a значения, которые вы должны придумать. Действительно, смысл ошибки для всех таков: «Я не могу придумать значение для вашего a <- или чего-то еще, что вы делаете».

person Stephen Compall    schedule 18.11.2019