John Millikin wrote:
Earlier today I uploaded the capped-list package; I didn't think there
would be any interest, since it's a relatively trivial data structure,
but already there's been three emails and an IRC convo about it.

Since uploading, there's been a big problem pointed out to me
regarding this structure, namely the possible definitions of |append|.

Any ideas? This seems like a useful structure, since several people
have described it, but some of the semantics seem troublesome.

Some ideas:

    append :: Monoid c => CappedList c a -> CappedList c a -> CappedList c a
    append (Cap a) (Cap b) = Cap (a `mappend` b)

This also leads to an instance Monoid (CappedList c):

    instance Monoid c => Monoid (CappedList c) where
        mempty  = Cap mempty
        mappend = append

You could also make the combining function flexible:

    appendWith :: (c -> d -> e) -> CappedList c a -> CappedList d a
               -> CappedList e a


The problem with this definition is that it doesn't really respect the structure of the second list: the entire list has to be traversed just to update the cap. More random ideas:

    -- this is bind in the CappedList _ a monad
    bindCap :: CappedList c a -> (c -> CappedList d a) -> CappedList d a

    bindCapF :: Functor f => CappedList c a
             -> (c -> f (CappedList d a))
             -> f (CappedList d a)


Twan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to