Как директивы spray соответствуют продолжениям?

#scala #spray #continuations #continuation-passing

#scala #spray #продолжения #продолжение-передача

Вопрос:

Я не вижу, как директивы spray соответствуют стилю передачи продолжения (CPS).

Более конкретно, продолжение есть (a -> r) -> r (в Haskell), но я не могу найти, где находится этот тип ( (a -> r) -> r ) при использовании директив spray (которые имеют тип Route->Route where type Route = RequestContext => Unit ).

Ни Route->Route ни type Route = RequestContext => Unit то ни (a -> r) -> r другое не похоже , так как же директивы соотносятся с CPS, не так ли?

Может ли кто-нибудь показать, как директива spray соответствует стилю передачи продолжения?

Ответ №1:

Директива в ее простейшей форме определяется как

 abstract class Directive[L <: HList] {
  def happly(f: L => Route): Route
}
  

что в точности является (a -> r) -> r . То, что вы видите в документации по директивам spray, — это DSL высокого уровня, который создает Directive экземпляры под капотом. Вы можете увидеть полное определение в Directive.scala