Brian Hulley wrote:
   class Foldable f  where
        fold :: (a -> b -> b) -> b -> f a -> b
        foldL :: ...

   class Reduce f where -- based on FingerTree paper
       reduceR :: (a -> b -> b) -> (f a -> b -> b)
       reduceL :: (b -> a -> b) -> (b -> f a -> b)

   class TakeDrop f where
       take :: Int -> f a -> f a
       takeWhile :: (a -> Bool) -> f a -> f a
       drop ...

   class Filter f where
       filter :: (a -> Bool) -> f a -> f a
       partition :: (a -> Bool) -> f a -> (f a, f a)

   class Indexable f where
      length :: f a -> Int
      at :: Int -> f a -> f a -- (*)
      splitAt :: Int -> f a -> (f a, f a)

[snip]
 I personally don't have enough experience of
Haskell yet to be able to recommend a solution.

None of the above type classes would be compatible with Data.ByteString! (You mentioned this issue before wrt Data.Edison.Seq but it just clicked with me now for the above refactoring.) For compatibility, the element type would need to appear also thus:

  class Foldable f_a a | f_a -> a where
       fold :: (a -> b -> b) -> b -> f_a -> b

  class Reduce f_a a | f_a -> a where
       reduceR :: (a -> b -> b) -> (f_a -> b -> b)
       reduceL :: (b -> a -> b) -> (b -> f_a -> b)

  instance Reduce [a] a where
       reduceR  f  l  x = foldr f  x  l
       -- etc

Thus Data.ByteString, as well as being extremely useful to store strings (!), is a central lynchpin in the entire re-factoring question since it's an example of a non-polymorphic collection type (or a collection with restricted polymorphism), and supporting it would require a redesign of existing ideas in this direction eg http://cvs.haskell.org/Hugs/pages/libraries/base/Data-Foldable.html is no use either.

Regards, Brian.

--
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.

http://www.metamilk.com
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to