type FirstProblem { error Failed(message: Text) } type SecondProblem { error Failed(message: Text) } type Captured { Done(value: Int) error First(problem: FirstProblem) error Second(problem: SecondProblem) } first() (value: Int) { fail(FirstProblem.Failed("first")) } forwardFirst() (value: Int) { value = first() } second() (value: Int) { fail(SecondProblem.Failed("second")) } forwardSecond() (value: Int) { value = second() } choose(flag: true) (value: Int) { value = forwardFirst() } choose(flag: false) (value: Int) { value = forwardSecond() } capture(flag: Bool) (value: Captured) { value = result(choose(flag)) } verify() (answer: Bool) recover("compare both nominal errors") { left = capture(true) right = capture(false) answer = left == Captured.First(FirstProblem.Failed("first")) and right == Captured.Second(SecondProblem.Failed("second")) }