Traversals of monomorphic containers (was: Re: mapM_ for bytestring)

# Redirected to haskell-cafe On Sun, 2013-09-01 at 14:58 +0400, Artyom Kazak wrote:
Would this be an appropriate place to propose adding mapM_ (and then possibly mapM) to bytestring library?
Was it suggested before? If yes, why was it rejected?
This got me wondering: there are several type-classes useful for polymorphic container types, e.g. Functor, Foldable & Traversable which all apply to some type of kind (* -> *). Are there related things for monomorphic containers, like ByteString, Text or some newtype'd Vector with fixed element type, e.g. class MFunctor f a where mfmap :: (a -> a) -> f -> f instance MFunctor ByteString Word8 where mfmap = ByteString.map or (maybe even better) class MFunctor f where type Elem mfmap :: (Elem -> Elem) -> f -> f instance MFunctor ByteString where type Elem = Word8 mfmap = ByteString.map and similar for other classes. Nicolas

On 09/02/13 06:53, Nicolas Trangez wrote:
# Redirected to haskell-cafe
On Sun, 2013-09-01 at 14:58 +0400, Artyom Kazak wrote:
Would this be an appropriate place to propose adding mapM_ (and then possibly mapM) to bytestring library?
Was it suggested before? If yes, why was it rejected?
This got me wondering: there are several type-classes useful for polymorphic container types, e.g. Functor, Foldable & Traversable which all apply to some type of kind (* -> *).
Are there related things for monomorphic containers, like ByteString, Text or some newtype'd Vector with fixed element type, e.g.
class MFunctor f a where mfmap :: (a -> a) -> f -> f
instance MFunctor ByteString Word8 where mfmap = ByteString.map
I'm not aware of this particular class, but I have considered it. In the end I've chosen to generalize the class to FactorialMonoid instead: class Monoid m => FactorialMonoid m where ... foldMap :: Monoid n => (m → n) → m → n ByteString and Text are instances of the class, and so are lists, maps, and other containers, and Sum and Product as well. http://hackage.haskell.org/packages/archive/monoid-subclasses/0.3.2/doc/html...
or (maybe even better)
class MFunctor f where type Elem mfmap :: (Elem -> Elem) -> f -> f
instance MFunctor ByteString where type Elem = Word8 mfmap = ByteString.map
and similar for other classes.
Nicolas
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

These questions are exactly what Control.Lens answers.
On 04/09/2013 12:50 PM, "Mario Blažević"
On 09/02/13 06:53, Nicolas Trangez wrote:
# Redirected to haskell-cafe
On Sun, 2013-09-01 at 14:58 +0400, Artyom Kazak wrote:
Would this be an appropriate place to propose adding mapM_ (and then possibly mapM) to bytestring library?
Was it suggested before? If yes, why was it rejected?
This got me wondering: there are several type-classes useful for polymorphic container types, e.g. Functor, Foldable & Traversable which all apply to some type of kind (* -> *).
Are there related things for monomorphic containers, like ByteString, Text or some newtype'd Vector with fixed element type, e.g.
class MFunctor f a where mfmap :: (a -> a) -> f -> f
instance MFunctor ByteString Word8 where mfmap = ByteString.map
I'm not aware of this particular class, but I have considered it. In the end I've chosen to generalize the class to FactorialMonoid instead:
class Monoid m => FactorialMonoid m where ... foldMap :: Monoid n => (m → n) → m → n
ByteString and Text are instances of the class, and so are lists, maps, and other containers, and Sum and Product as well.
http://hackage.haskell.org/**packages/archive/monoid-** subclasses/0.3.2/doc/html/**Data-Monoid-Factorial.htmlhttp://hackage.haskell.org/packages/archive/monoid-subclasses/0.3.2/doc/html...
or (maybe even better)
class MFunctor f where type Elem mfmap :: (Elem -> Elem) -> f -> f
instance MFunctor ByteString where type Elem = Word8 mfmap = ByteString.map
and similar for other classes.
Nicolas
______________________________**_________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/**mailman/listinfo/haskell-cafehttp://www.haskell.org/mailman/listinfo/haskell-cafe
______________________________**_________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/**mailman/listinfo/haskell-cafehttp://www.haskell.org/mailman/listinfo/haskell-cafe
participants (3)
-
Mario Blažević
-
Nicolas Trangez
-
Tony Morris