Sagen wir, ich habe diesen Code:Wie kann ich eine Leitung mit mehreren Kommunikationsarten haben?
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
Derzeit immer der Client sendet Int
und empfängt Bool
. Ich möchte jedoch, dass der Client auch den höchsten Wert abfragen kann, den der Server bisher gesehen hat. Also brauche ich auch die Kommunikation von Senden ()
und Empfangen Int
. Ich konnte dies als der Kunde kodieren, der Either Int()
sendet und Either Bool Int
empfängt. Allerdings möchte ich sicherstellen, dass die beiden nicht gemischt sind - Senden einer Int
erhält immer eine Bool
Antwort.
Wie kann das gemacht werden?
Warum würde nicht funktionieren? Wenn Sie ein Entweder an den Server senden, können Sie in den Fällen Links oder Rechts Muster zuordnen und eine entsprechende Links- oder Rechtsrückseite senden. – Dwilson
@Dwilson: Er möchte statisch sicherstellen, dass das Senden von 'Int' immer ein' Bool' zurückgibt. Die Verwendung von "Entweder" würde diese Prüfung zur Laufzeit verschieben. –