AK
forall.Допустим, есть такой тип:
data X
= Var1 (Int -> Effect Unit)
| Var2 (String -> Effect Unit)
| Var3 (forall st. Tuple st (st -> Effect st))
где
st — это состояние, которое "фолдится" между "вызовами" функции, и в момент "вызова" это должен быть один и тот же тип.Tuple <изначальное состояние> (<предыдущее состояние> -> Effect <следующее состояние>)Пытаюсь написать хэндлер для подобного типа, но мне компилятор пишет
The type variable st has escaped its scope в любом случае, где участвует Effect. Обработчик работает с st только внутри и не "возвращает" его наружу.Вопрос: Я продолжаю неправильно понимать
forall.? Мне кажется, в этом месте я сообщаю, что st будет в пределах "вызова" функции одинаков и этой гарантии должно быть достаточно.newtype StateF st = StateF (Tuple st (st -> Effect st))Теперь другой вопрос, можно ли обойтись без обёртки
data X
= Var1 (Int -> Effect Unit)
| Var2 (String -> Effect Unit)
| Var3 (Exists StateF)
handler :: X -> Effect Unit
handler (Var1 f) = f 1
handler (Var2 f) = f ""
handler (Var3 f') = do
_ <- runExists
(\(StateF (Tuple initialState f)) -> do
_ <- f initialState
pure unit
)
f'
pure unit
newtype и без пакета (посмотрел в тип runExists и показалось, что всё-таки можно)?
