나는 게임 엔진을 구현 중이다. 현재 대부분의 코드는 StateT Game IO()
모나드에 있습니다. 나는 하나 개의 기능을 통해, 모든 선물 옵션을 사용자에게 묻는 응답 읽고, 그것을 반환Control.Proxy를 사용하도록 StateT IO 모나로 변환 - 서버이고 클라이언트입니까?
getChoice :: Show a => [ a ] -> IO a
모든 IO 채널을 사용자 입력을 얻기 위해 IO를 사용하고 사실이다. 사용자 응답 (및 초기 상태)의 특정 흐름에 대해 게임은 결정 론적으로 진행되며 테스트를 돕기 위해 이러한 사용자 응답을 분석하고 싶습니다.
내가 파이프를 사용하도록 변환하려고하면 가장 가까운 느낌은 현재 StateT Game IO()
에있는 모든 코드를 변경하고 Proxy p, Monad m => Client p [String] String m()
에서 실행되도록하는 것입니다. 이 방법으로 사용자의 선택을 여전히 요청할 수 있습니다. 그러면 사용자 선택이 필요할 때 제공 될 것이라고 가정하고 차단 스타일로 엔진 코드를 작성할 수 있습니다.
그러나 이것은 틀린 것 같습니다. 분명히 사용자는 클라이언트 여야하고 게임 엔진은 서버입니까? 이 구별을 올바르게하기 위해 어떤 원칙을 사용할 수 있습니까? 상류 및 하류 request
와 respond
, 그대로 pipes
에서