Dire che ho questo codice:Come posso avere una pipe con più tipi di comunicazione?
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
Attualmente il client invia sempre Int
, e riceve Bool
. Tuttavia, voglio che il client sia in grado di interrogare il valore più alto che il server abbia visto finora. Quindi ho anche bisogno di comunicare di inviare ()
e di ricevere Int
. Potrei codificarlo come client che invia Either Int()
e riceve Either Bool Int
. Tuttavia, mi piacerebbe assicurarmi che i due non siano misti - l'invio di un Int
ottiene sempre una risposta Bool
.
Come si può fare?
Perché non dovrebbero o lavoro? Se si invia una Either al server, è possibile eseguire la corrispondenza del modello nelle caselle Left o Right e inviare un appropriato Left o Right back. – Dwilson
@Dwilson: Vuole garantire staticamente che l'invio di 'Int' restituisca sempre un' Bool'. L'uso di "Entrambi" sposterebbe questo controllo in runtime. –