Ты, наверно, совсем не знаешь, что такое LINQ? Иначе как можно сомневаться, что это хорошо?
Надо перечень фич показать или сформулировать, почему организация разного рода выборок данных на основе каких-то критериев в императивном стиле очень неудобна?
Это ты говоришь про высокоуровеневую штуку «как это выглядит в виде API». А я написал как это выглядит под капотом - там где tailcallы нужны.
У тебя есть код.
Прямой код:
fun double(X) = X * X.
main...
Y = double(6).
Z = double(Y)
print(Z).
или проще:
print(double(double(6))).
CPS код:
fun double(X, k) = k(X*X).
main...
double(6, Y -> double(Y, Z -> print(Z))).
Смысл - можно нажать паузу/сохранить контекст вычислений/запросить асинхронно ввод перед исполнением последующего кода переданноого в виде замыкания.
Данное преобразование может осуществлятся автоматически. Абсолютная необходимость в таких преобразованиях - tail-callы. В контексте tailcall/continuation речь идет скорее о поддержке CPS в JVM чем о высокоуровневом фреймворке для жабы.
Разница между ними в том чт опервый пример все на лямбдах а тут есть конкретная функция.
double(X, k) -> k(X*X)
тоже что
(X,k) -> k(X*X) или после карринга X -> k -> k(X*X), где если вместо k подставить print(Y) aka Y -> print(Y) получиться такой же бред как наверху X -> (Y -> print(Y))(X*X) (в декаррированном редуцированном виде). Наверху меня сильно покусали лямбды - но суть преобразования та же самая.