При обычном использовании хендл-паттерна, сам по себе хендл - это иммутабельный объект, который передаётся в функции на манер ридера.
Если требуется хранить переменное состояние, то это можно решить такими методами:
Хранить в хендле мутабельную ссылку - STRef, IORef, TVar.
Сделать хендл параметризованным по монаде и хранить в нём функцию-аксессор и функцию-мутатор состояния:
data Handle m = Handle
{ config :: Config
, getUsers :: m [Users]
, updateUsers :: ([Users] -> [Users]) -> m ()
}
С другой стороны, если хочется оставить как есть - это тоже имеет право на жизнь; однако, в таком случае, для этой структуры более верным названием будет State - оно более точно передаст её назначение, и не будет сбивать с толку неверными ассоциациями с классическим хендл-паттерном.
https://github.com/DenDragonB/echobot/blob/eab9a733042a38d49c7f2a17892d7791c6c5b244/src/Bot.hs#L25-L29
При обычном использовании хендл-паттерна, сам по себе хендл - это иммутабельный объект, который передаётся в функции на манер ридера. Если требуется хранить переменное состояние, то это можно решить такими методами:
STRef
,IORef
,TVar
.С другой стороны, если хочется оставить как есть - это тоже имеет право на жизнь; однако, в таком случае, для этой структуры более верным названием будет
State
- оно более точно передаст её назначение, и не будет сбивать с толку неверными ассоциациями с классическим хендл-паттерном.