Нет такой вещи, как «самая чистая», либо функция выполняет побочные эффекты, либо нет (вы можете различать типы побочных эффектов, но это другая тема). Таким образом, если вам нужно состояние в чистой функции, единственный способ - передать состояние «до» в качестве параметра и вернуть состояние «после», например:
val handler : Request => State => (Response, State)
Это похоже на монаду IO в Haskell. Это можно определить так в Scala:
type IO[A] = State => (A, State)
Таким образом, вышесказанное можно записать более кратко как:
val handler : Request => IO[Response]