J'ai un problème avec Data.Serialize. Lorsque je code une structure de données, je peux encoder toutes les structures de données qui sont des instances de la classe Serialize. Cela fonctionne très bien. Je l'envoie ensuite sur le réseau.Quel est le bon usage de Data.Serialize "Sither String"
Cependant, j'ai un problème lors du décodage. La fonction de décodage me renvoie un type appelé "Either String
" où je ne suis pas sûr de savoir comment utiliser cela pour reconstruire ma structure de données d'origine à partir du fait que le destinataire sait seulement qu'il avait précédemment été une instance de Serialize
.
receiveMessage :: Socket -> IO (a, SockAddr)
receiveMessage s = do
(msg, remoteSockAddr) <- recvFrom s 512
return (S.decode $ msg, remoteSockAddr)
Couldn't match type `a' with `Either String a0'
`a' is a rigid type variable bound by
the type signature for receiveMessage :: Socket -> IO (a, SockAddr)
In the expression: decode $ msg
In the first argument of `return', namely
`(decode $ msg, remoteSockAddr)'
In the expression: return (decode $ msg, remoteSockAddr)
L'utilisation par ex. receiveMessage :: (Serialize a) => Socket -> IO (a, SockAddr)
n'est pas une aide non plus. Comment pourrais-je gérer cela et mieux récupérer ma structure de données originale?
Merci, pensé que les parens dans ce cas sont autour (msg, remoteSockAddr), au moins il se comporte comme si .... –
Ces parens sont différents et juste là pour faire un tuple. Le '$' ne s'étendrait que jusqu'à ',' dans ce cas, donc '(S.decode $ msg, remoteSockAddr)' est identique à '(S.decode (msg), remoteSockAddr)' qui est toujours redondant. –