说我有这样的代码:如何获得具有多种通信类型的管道?
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
。但是,我想确保两者不混合 - 发送Int
总会得到Bool
响应。
这怎么办?
为什么会也不行?如果您将任一个发送到服务器,您可以在左或右情况下进行模式匹配,并发送适当的左或右返回。 – Dwilson
@Dwilson:他想静态确保发送'Int'总是返回一个'Bool'。使用'Either'会将此检查移至运行时。 –