このコードがあるとします:
import Control.Monad.State hiding (StateT)
import Control.Proxy
server :: (Proxy p, Monad m) => Int -> Server p Int Bool (StateT Int m) ()
server = runIdentityK loop
where loop arg = do
currMax <- lift get
lift $ put $ max currMax arg
nextArg <- respond (even arg)
loop nextArg
client :: (Proxy p, Monad m) => Client p Int Bool m ()
client = runIdentityP loop
where loop = go 1
go i = do
isEven <- request i
go $ if isEven
then i `div` 2
else i * 3 + 1
現在、クライアントは常に を送信Int
し、受信しBool
ます。ただし、クライアントがサーバーがこれまでに確認した最高値を照会できるようにしたいと考えています。()
なので送受信の通信も必要Int
です。Either Int ()
これをクライアントの送信および受信としてエンコードできますEither Bool Int
。ただし、この 2 つが混在しないようにしたいと思います。 を送信すると、Int
常にBool
応答が返されます。
これはどのように行うことができますか?