Вам нужно будет решить, какой из агента и среды находится «сверху» - давайте предположим, что до конца этого ответа это среда сверху, вызывающая агента, так как это, как правило, наиболее целесообразно.
Вы можете сохранять представления данных Агента частными, используя систему модулей - просто экспортируйте имя типа данных без каких-либо его внутренних компонентов.
module Agent (AgentState, other_stuff) where
в отличие от
module Agent (AgentState(..), other_stuff) where
Если агенту также необходимо передать состояние среды (хотя я не вижу никакой причины, по которой это необходимо, поскольку среда может отслеживать его для себя), то сделайте функции агента полиморфными, чтобы они могли передал любой тип состояния - тогда окружение может передать все, что захочет, без представления его представления.
Также должно быть возможно использовать монады состояний для достижения большего контроля над тем, что происходит с состоянием, например, предотвращая дублирование средой состояния, которое ему дает агент, и неоднократно вызывая агента с тем же состоянием, но если вы ' Вы новичок в Хаскеле, вероятно, лучше сначала получить немного опыта без монад. (Не то, чтобы монады были особенно страшными или что-то в этом роде, но они действительно скрывают от вас детали, поэтому труднее увидеть, что происходит.)