We can implement a version of the compos operator like so:class (ReflectDescriptor a, Typeable a, Wire a) => ProtoBuf a
data Expression a b whereOpenTable :: (ProtoBuf b) => Int -> Table -> Expression () bOpenFile :: (ProtoBuf b) => Int -> String -> Expression () bWriteFile :: (Typeable a, ProtoBuf b) => Int -> String -> Expression a b -> Expression b ()WriteTable :: (Typeable a, ProtoBuf b) => Int -> Table -> Expression a b -> Expression b ()Map :: (ProtoBuf a, ProtoBuf b, ProtoBuf c) => Int -> (a -> b) -> Expression c a -> Expression a bLocalMerge :: (ProtoBuf a) => Int -> [Expression c a] -> Expression c a