Haskell에서 내부 상태를 가진 두 개의 상호 생산자/소비자를 어떻게 만들려고합니까?

StackOverflow https://stackoverflow.com/questions/844870

문제

상태/액션 쌍의 유용성을 내부적으로 표현하는 동시에 상태를 취하고 행동을 반환하는 에이전트가 있습니다. 또한 행동을 취하고 상태/보상 쌍을 반환하는 환경도 있습니다.

에이전트를 시작 상태로 설정 한 다음 에이전트 -(action) -> 환경 -(상태, 보상) -> 에이전트 -(action) -> ... 그러나 내부 상태에서 지속적으로 이동할 수 있어야합니다. (모든 반복을 업데이트해야 함)는 비공개 (즉, 에이전트 또는 환경 내에서)를 유지해야합니다. 이것은 상태와 행동을 인수로 사용하여 에이전트 내에서 환경을 기능으로 호출 할 수 없다는 것을 의미합니다.

나는 다소 Haskell Noobie의 것이므로 이것이 가능한지조차 확실하지 않습니다.

도움이 되었습니까?

해결책

두 가지 질문 :

  • 에이전트가 상태를 사용하여 조치를 계산해야한다면, 국가의 표현을 에이전트로부터 비밀로 유지해야합니까?

  • 환경이 조치가 주어진 상태 (및 보상)를 생산할 것으로 예상된다면, 국가의 표현을 환경에서 비밀로 유지할 것을 어떻게 기대합니까?

둘 다 가능하지만 각각은 상태를 쿼리하거나 상태를 창출하기위한 일종의 추상화를 포함해야합니다. 이 디자인에 대해 기분이 좋지 않습니다.

질문을 명확히하는 데 도움이 될 것입니다

  • 관심있는 기능에 대한 유형 서명을 제공합니다

  • 상태 표현을 원하는 기능을 식별 ~ 아니다 노출됩니다.

추신 이러한 어려움은 Haskell과 상당히 분리 될 수 있으며 구현 언어의 선택에 관계없이 문제가 될 것입니다 (구현 언어가 지원하는 경우. 약간 프라이버시 형태).

다른 팁

에이전트와 환경이 "상단"에 있는지 결정해야합니다.이 답변의 나머지 부분에 대해 일반적으로 가장 의미가 있기 때문에 에이전트를 호출하는 환경이라고 가정 해 봅시다.

모듈 시스템을 사용하여 에이전트의 데이터 표현을 비공개로 유지할 수 있습니다. 내부를 사용하지 않고 데이터 유형 이름을 내보내십시오.

module Agent (AgentState, other_stuff) where

반대

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

에이전트가 환경의 상태를 통과 해야하는 경우 (환경이 자체적으로 추적 할 수 있으므로 어떤 이유도 볼 수는 없지만, 에이전트가 전달 될 수 있도록 에이전트가 다형적으로 작동하도록합니다. 어느 상태 유형 - 그러면 환경은 표현이 노출되지 않고 좋아하는 것을 통과 할 수 있습니다.

예를 들어 환경이 주를 복제하는 것을 방지하고 에이전트를 동일한 상태로 반복적으로 호출하는 등 주 모나드를 사용하여 주에 발생하는 일을 더 많이 통제 할 수 있어야합니다. Haskell Monads없이 약간의 경험을 얻는 것이 가장 좋습니다. (모나드는 특히 무섭지 않거나 무엇이든, 그들은 당신에게서 세부 사항을 숨기므로 무슨 일이 일어나고 있는지보기가 더 어렵습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top