Ulrich Schuster
01/17/2025, 1:54 PMaccumulate DSL:
1. The DSL lets me use the "normal" ensure and ensureNotNull calls inside an accumulate block. Will the resulting errors be accumulated, or do I need to use ensureOrAccumulate resp. ensureNotNullOrAccumulate? What is the difference between these two approaches?
2. If I do the following in an accumulate block, the type checker ist happy:
accumulate{
  val a = doSomething().bindOrAccumulate()
  val b = doSomethingElse(a).bindOrAccumulate()
  ConstructType(a, b)
}
That is, b might depend on a. This is different than the typical applicative block, where only the result may depend on the individual bound results. Does the above work? Does the block short-circuit if a result is needed downstream and otherwise keeps on accumulating?Youssef Shoaib [MOD]
01/17/2025, 5:19 PMraise immediately. The difference is that when you use an XOrAccumulate version, you are saying that the rest of the accumulate block doesn't care whether that condition is false or not.
2. The type checker isn't happy because bindOrAccumulate returns RaiseAccumulate.Value, which is basically an `Option`(kind of). We have explicit support for this though simply by using delegation:
accumulate {
  val a by doSomething().bindOrAccumulate()
  doSomethingThatMightAccumulate()
  val b by doSomethingElse(a).bindOrAccumulate()
  // if a had an error, the next lines won't run, and `accumulate` would've raised a's error, along with any accumulated error from doSomethingThatMightAccumulate
  doAThirdThing()
  ConstructType(a, b)
  // if b had an error, the next line won't run, and its error would've been raised, alongside any accumulated error from doAThirdThing and doSomethingThatMightAccumulate
  doAFourthThing
}Ulrich Schuster
01/17/2025, 5:23 PM