Основываясь на ответе Уилла Несса и, поскольку у меня есть возможность переставить аргументы в моем коде, я могу получить следующее
foldAccumulate :: (Monad m) => (a -> s -> m (b, s)) -> [a] -> s -> m [b]
foldAccumulate f = evalStateT . traverse (StateT . f)
, которое действительно является traverse
с соответствующей монадой StateT m
, ине нужно ничего писать, я не знаю, почему я этого не видел :-).Спасибо!