Data.Serialize に問題があります。データ構造をエンコードすると、Serialize クラスのインスタンスであるすべてのデータ構造をエンコードできます。それは非常にうまく機能します。
次に、ネットワーク経由で送信します。
ただし、デコードするときに問題があります。デコード関数は " Either String
" と呼ばれる型を返しますが、これをさらに使用して元のデータ構造を再構築する方法がよくわかりません。受信者は、以前は のインスタンスであったことしか知りません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)
eg を使用し receiveMessage :: (Serialize a) => Socket -> IO (a, SockAddr)
ても役に立ちません。どうすればこれに対処し、元のデータ構造を取り戻すことができるでしょうか?