私はいくつかの異なるプロトコルを処理しており、そのメッセージをチャネルに保存しています。これを行うには、両方のタイプのメッセージをキャプチャする合計型を使用しています。 Binary
のデコードインスタンスを書くのに問題があります。どのプロトコルをデコードしたいのか分かりますが、醜いnewtypeラッパーを使わずに強制する方法はわかりません。コードは合計型のバイナリインスタンス
-- Supported protocols
data ProtoA = ProtoA
data ProtoB = ProtoB
-- Protocol sum type for storing messages in a channel.
data P = PA ProtoA | PB ProtoB
-- messages stored in a channel that can support either message.
type PChan = TChan P
instance Binary ProtoA where
put ProtoA = return()
get = return ProtoA
instance Binary ProtoB where
put ProtoB = return()
get = return ProtoB
instance Binary P where
-- on put, have the constructor available to drive behavior
put (PA ProtoA) = return()
put (PB ProtoB) = return()
-- on get, nothing to differentiate behavior
-- don't want alternation
get = undefined
-- Yuck, wrapped newtypes instances...
newtype PA' = PA' P
newtype PB' = PB' P
instance Binary PA' where
put (PA' (PA ProtoA)) = return()
put (PA' (PB ProtoB)) = fail "shouldn't happen"
get = return (PA' (PA ProtoA))
instance Binary PB' where
put (PB' (PA ProtoA)) = fail "shouldn't happen"
put (PB' (PB ProtoB)) = return()
get = return (PB' (PB ProtoB))
これを処理するには良い方法はありますか?おそらくファントムタイプで?デコード時に、私はどのプロトコルを扱っているのか知っていますが、強制する方法はわかりません。アドバイスや提案を大歓迎!ありがとう!