когда я создаю выбор с помощью любой функции, всякий раз, когда возникает ошибка, означает, что они возвращают значения в левую часть либо, что завершает сам полный шаблон, который не продолжается дальше для выполнения другого сценария, как сделать обе те же функции в дамль вместо Либо.
Что можно использовать вместо Либо в DAML?
Ответы (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 <-
или чего-то еще, что вы делаете».