Say mam ten kod:Jak mogę utworzyć potok z wieloma typami komunikacji?
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
Obecnie klient zawsze wysyła Int
i odbiera Bool
. Jednak chcę, aby klient mógł również wyszukiwać najwyższą wartość, jaką serwer widział do tej pory. Potrzebuję również komunikacji wysyłania ()
i odbierania Int
. Mogę zakodować to jako klient wysyłający Either Int()
i otrzymujący Either Bool Int
. Jednak chciałbym się upewnić, że oba nie są mieszane - wysłanie Int
zawsze daje odpowiedź Bool
.
Jak można tego dokonać?
Dlaczego nie chciał czy praca? Jeśli wyślesz do serwera, możesz dopasować wzorzec w przypadku lewej lub prawej strony i wysłać odpowiedni lewy lub prawy tył. – Dwilson
@Dwilson: Chce statycznie upewnić się, że wysyłanie 'Int' zawsze zwraca' Bool'. Użycie 'albo" przeniesie to sprawdzanie do środowiska wykonawczego. –