Adding binarySize to Binary
droundy at darcs.net
Mon Feb 5 14:37:35 EST 2007
On Mon, Feb 05, 2007 at 06:37:38PM +0000, Neil Mitchell wrote:
> >As it would operate on types rather than values (think sizeOf), the
> >result for "[a]" would probably be "(1, Nothing)" - a list takes one
> >byte at minimum and infinite bytes at maximum.
> That interface seems horrible - it looks like it will only be useful
> to a small number of people, and not be general at all. I really don't
> like the idea of an interface specifying a "fuzz factor" (which is
> what upper/lower bounds correspond to)
But often a fuzz factor is helpful, and it's always well-defined. One
would often like to allocate padded structures so you can either modify
them in-place or have O(1) access to the elements, and you need a max size
for that. The min size would be helpful for knowing when it's worth
padding. It'd be heuristic, but if the max size is 1000 times larger than
the min size, you might not want to always allocate the maximum.
> In my BinaryDefer library I have a class BinaryDeferStatic:
> class BinaryDefer a => BinaryDeferStatic a where
> -- | Must be a constant, must not examine first argument
> getSize :: Proxy a -> Int
> This is for things which have a fixed and static size based on their type.
Except that the class-based approach is no good for a function (or data
type) which is intended to work with any data, even that which doesn't have
a static size.
> I could also see a reason for having a sizeOf method in the Binary
> class - where if unimplemented it just calls encode and then B.length.
Except that sizeOf as you describe it would operate on values rather than
on types, and as such would be useless for any of the uses of binarySize.
> Anything else just seems to be an ugly API...
I agree about the ugliness of binarySize as implemented (returning a
tuple). Why not something like:
class Binary a where
maxSize :: Proxy a -> Maybe Int
maxSize _ = Nothing
minSize :: Proxy a -> Int
minSize _ = 0
staticSize :: Proxy a -> Maybe Int
staticSize p | maxSize p == Just (minSize p) = maxSize p
staticSize _ = Nothing
Thus one can do nice things like make an array class that operates on any
Binary data, but can do nice tricks to optimize access times. e.g. one
might want to allocate N*maxSize space, so you can have O(1) writes (in a
mutable array, or on disk).
Department of Physics
Oregon State University
More information about the Libraries