type A
type B
type C
type D
type Error
type Input
type ABCDResult
def parse(input: Input): Either[Error, ABCDResult] = {
val aOpt: Option[A] = ???
val bOpt: Option[B] = ???
val cOpt: Option[C] = ???
val dOpt: Option[D] = ???
Either.cond(aOpt.nonEmpty || bOpt.nonEmpty || cOpt.nonEmpty || dOpt.nonEmpty, ABCDResult(...), Error)
}
это ты показываешь как раз рантайм часть, в которой компайл тайм тебе нах не нужен. ты покажи как ты потом работать собираешься с ABCDResult и где действительно показана необходимость компайл тайм ограничений на абцд.
если у тебя АБСД строится исключительно в рантайме, то просто убери всякую возможность построить АБЦД в компайл тайме обходя базовую проверку и все проблемы у тебя сами исчезнут