Szukam takiego typu, który pozwoli mi reprezentować kontekst, w którym uruchamiany jest fragment kodu. Na przykład:Czy istnieje typ kontynuacji do zawijania bloku wykonawczego, jak (Ctx => R) => R lub (=> R) => R?
def withinContext[R]: ((=> R) => R) =
(inner) => {
initializeSomeResource()
try {
inner
} finally {
releaseTheResource()
}
}
które następnie można używać po prostu jako
withinContext {
...
}
lub, jeżeli wewnętrzny blok kodu wymaga pewnych informacji z kontekstu, uogólnić go jako
def withinContext[R]: ((Ctx => R) => R) = ...
Ich przypadki użycia w przybliżeniu odpowiadają Haskellowi bracket_
i bracket
.
mogę używać typów (=> R) => R
i (A => R) => R
bezpośrednio, ale wtedy nie mam funkcje ułatwiające łączenie takich obwolut kontekstu, więc zastanawiam się, jest coś takiego już istniejący w ekosystemie Scala?
zamyka co wiem, to scala.util.control.Exception.Catch
, który zapewnia przyjemne funkcje do budowy i łączenia Catch
instancje, ale wydaje się, że nie ma mowy o żadnej inicjalizacji przed uruchomiony wewnętrzny blok jest wykonywany. Również (nie jest to tak ważne dla mojego przypadku użycia) nie pozwala na podanie parametrów do wewnętrznego obliczenia, tak jak w przypadku (A => R) => R
.
Typ to monada kontynuacyjna, odpowiadająca Haskellowi ContT r IO a
, ale nie mogłem znaleźć implementacji kontynuacyjnej monady w żadnej standardowej bibliotece Scali (być może jest ukryta gdzieś głęboko w Scalazie, gdzie tęskniłem).
Nie żeby to w ogóle pomogło, ale dla własnego zrozumienia, czy byłoby sens definiować wewnątrz Kontekstu jako "def w obrębie Kontekstu [R] (r: => R): R"? – acjay
@acjay To prawda, chciałem tylko wskazać pełny typ, którego szukam. –