Как мне создать двух взаимных производителей / потребителей с внутренним состоянием в Haskell? - PullRequest
3 голосов
/ 10 мая 2009

У меня есть агент, который принимает состояния и возвращает действия, сохраняя при этом внутреннее представление о полезности пар состояние / действие. У меня также есть среда, которая выполняет действия и возвращает пары состояние / награда.

Мне нужно иметь возможность настроить агента с начальным состоянием, а затем постоянно переходить от агента - (действие) -> среда - (состояние, вознаграждение) -> агент - (действие) -> ... Однако внутренние состояния (которые должны обновляться на каждой итерации) должны оставаться закрытыми (то есть внутри агента или среды). Это означает, что я не могу просто вызывать окружение как функцию внутри агента, используя состояние и действие в качестве аргументов.

Я в некотором роде новичок на Хаскеле, поэтому я даже не уверен, возможно ли это.

Ответы [ 2 ]

2 голосов
/ 11 мая 2009

Два вопроса:

  • Если агент должен использовать состояние для вычисления действия, то как вы собираетесь хранить представление состояний в секрете от агента?

  • Если среда ожидает создания состояния (и вознаграждения) за действие, как вы ожидаете сохранить представление состояний в секрете от среды?

Оба они возможны, но каждый из них должен включать какую-то абстракцию для запроса состояний или создания состояний. У меня нет хорошего представления об этом дизайне.

Это поможет прояснить вопрос по

  • Предоставление подписей типов для интересующих функций

  • Определение функций, которые вы хотите, чтобы представление состояний не было открыто.

P.S. Эти трудности вполне отделимы от Haskell и могут возникать независимо от выбора языка реализации (при условии, что язык реализации поддерживает некоторую форму конфиденциальности).

2 голосов
/ 10 мая 2009

Вам нужно будет решить, какой из агента и среды находится «сверху» - давайте предположим, что до конца этого ответа это среда сверху, вызывающая агента, так как это, как правило, наиболее целесообразно.

Вы можете сохранять представления данных Агента частными, используя систему модулей - просто экспортируйте имя типа данных без каких-либо его внутренних компонентов.

module Agent (AgentState, other_stuff) where

в отличие от

module Agent (AgentState(..), other_stuff) where

Если агенту также необходимо передать состояние среды (хотя я не вижу никакой причины, по которой это необходимо, поскольку среда может отслеживать его для себя), то сделайте функции агента полиморфными, чтобы они могли передал любой тип состояния - тогда окружение может передать все, что захочет, без представления его представления.

Также должно быть возможно использовать монады состояний для достижения большего контроля над тем, что происходит с состоянием, например, предотвращая дублирование средой состояния, которое ему дает агент, и неоднократно вызывая агента с тем же состоянием, но если вы ' Вы новичок в Хаскеле, вероятно, лучше сначала получить немного опыта без монад. (Не то, чтобы монады были особенно страшными или что-то в этом роде, но они действительно скрывают от вас детали, поэтому труднее увидеть, что происходит.)

...