Я знаю, как это сделать в Lisp / Scheme / Racket, но не в Scala.
// inputType derives from In and could be of subtype In1, In2, In3, ...
// outputType derives from Out and could be of subtype Out1, Out2, Out3, ...
def invokeTheRightFunction
(functionName: Mystery1, inputData: [subtype of In], outputType: Mystery2): Mystery3 =
{
val lookupTable =
List( Mystery4(functionName1, inputType1, outputType1),
Mystery4(functionName2, inputType2, outputType2),
...
Mystery4(functionNameN, inputTypeN, outputTypeN) )
...Mystery5...
}
На основе значений functionName
, inputType
и outputType
, заданных inputData
который имеет конкретный подтип In
, возможно ли использовать построение lookupTable так, чтобы правильная функция вызывалась с inputData
, а возвращаемое значение из функции с lookupTable имеет правильный подтип Out
?
Если вам интересно, почему я не просто использую match/case
, это потому, что я хочу, чтобы в библиотеке был какой-то общий код [обработки базы данных], но код, который использует библиотеку, будетзнать, какие все типы должны входить и выходить.
Код для In
, Out
и "Mysteries" будет в библиотеке.
Подтипы In
и Out
и lookupTable
будут в коде, который использует библиотеку.
Чтобы сделать это немного более конкретным, допустим, у меня есть [база данных] хранимых процедур A
, B
C
. В настоящее время я помещаю входные данные для этих хранимых процедур в классы дел, называемые ArgsA
, ArgsB
, ArgsC
. Я получаю ответы обратно в виде последовательности RowA
, RowB
, RowC
. Я хочу, чтобы вся или большая часть обработки ошибок происходила в библиотеке.
У моего кода теперь есть некоторое дублирование спецификации типа, и я пытаюсь объединить спецификацию типов в одну таблицу поиска, чтобыуменьшить вероятность ошибки.