
Apologies if this isn't clear, I suspect if I understood the terminology better I'd already have solved the problem. I've got a foldable of a foldable of a. (Specifically `[Set a]`) and I want to be able to express the concept that I can treat `(Foldable f1, Foldable f2) => f1 (f2 a)` as `f3 a` i.e. a foldable of a foldable of a can be newtyped to a foldable of a. At least, I think that's right. Sadly, my attempts at actually expressing this concept have met with incomprehension from GHC, could someone help me out, please? Thanks, Julian.

A foldable of a foldable is itself foldable. That fact is expressed in Control.Compose: https://hackage.haskell.org/package/TypeCompose-0.9.10/docs/Control-Compose.... instance (Foldable g, Foldable f, Functor g) => Foldable (:. g f) On 03/01/15 01:14, Julian Birch wrote:
Apologies if this isn't clear, I suspect if I understood the terminology better I'd already have solved the problem. I've got a foldable of a foldable of a. (Specifically `[Set a]`) and I want to be able to express the concept that I can treat `(Foldable f1, Foldable f2) => f1 (f2 a)` as `f3 a` i.e. a foldable of a foldable of a can be newtyped to a foldable of a. At least, I think that's right.
Sadly, my attempts at actually expressing this concept have met with incomprehension from GHC, could someone help me out, please?
Thanks,
Julian.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

Thankyou Tony, that works perfectly. I think my biggest problem was that I
didn't even know you could write
```
newtype (Compose g f) a = O (g (f a))
```
It's logical, but I couldn't figure it out and none of the web pages I
could find mentioned it (and the compiler just complains if you try
"newtype Compose g f a = "
Also, is the Functor declaration really necessary? Seems like you can
write
```
instance (Foldable f1, Foldable f2) => Foldable (Compose f1 f2) where
foldr f start (O list) = foldr g start list
where g = flip . foldr f
```
I'm certainly going to spend some time examining Control.Compose. I think
my Haskell brain bending just went up a level, (sadly, not my actual brain.)
Thanks again,
Julian.
On 2 January 2015 at 15:16, Tony Morris
A foldable of a foldable is itself foldable. That fact is expressed in Control.Compose:
https://hackage.haskell.org/package/TypeCompose-0.9.10/docs/Control-Compose....
instance (Foldable g, Foldable f, Functor g) => Foldable (:. g f)
On 03/01/15 01:14, Julian Birch wrote:
Apologies if this isn't clear, I suspect if I understood the terminology better I'd already have solved the problem. I've got a foldable of a foldable of a. (Specifically `[Set a]`) and I want to be able to express the concept that I can treat `(Foldable f1, Foldable f2) => f1 (f2 a)` as `f3 a` i.e. a foldable of a foldable of a can be newtyped to a foldable of a. At least, I think that's right.
Sadly, my attempts at actually expressing this concept have met with incomprehension from GHC, could someone help me out, please?
Thanks,
Julian.
_______________________________________________ Beginners mailing listBeginners@haskell.orghttp://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Fri, Jan 2, 2015 at 11:28 PM, Julian Birch
could find mentioned it (and the compiler just complains if you try "newtype Compose g f a = "
Whatever's on the right of = got eaten by them gremlins, but newtype (Compose g f) a = O (g (f a)) is equivalent to newtype Compose g f a = O (g (f a)) Try it. Application is left-associative at the type-level just like value-level.
Also, is the Functor declaration really necessary? Seems like you can write
``` instance (Foldable f1, Foldable f2) => Foldable (Compose f1 f2) where foldr f start (O list) = foldr g start list where g = flip . foldr f
Looks to me the case too. For the record, here's what's in Conal's TypeCompose 0.9.10: -- These next two instances are based on suggestions from Creighton Hogg: instance (Foldable g, Foldable f, Functor g) => Foldable (g :. f) where -- foldMap f = fold . fmap (foldMap f) . unO foldMap f = foldMap (foldMap f) . unO -- fold (O gfa) = fold (fold <$> gfa) -- fold = fold . fmap fold . unO fold = foldMap fold . unO -- I could let fold default -- Kim-Ee

Ah! That also works. I think I was a bit confused originally, not putting
enough parameter on the left and not enough parens on the right. Being able
to read Conal's code made all the difference. (Oh, and it should have been
"flip $ foldr f".)
J
On 2 January 2015 at 16:59, Kim-Ee Yeoh
On Fri, Jan 2, 2015 at 11:28 PM, Julian Birch
wrote: It's logical, but I couldn't figure it out and none of the web pages I
could find mentioned it (and the compiler just complains if you try "newtype Compose g f a = "
Whatever's on the right of = got eaten by them gremlins, but
newtype (Compose g f) a = O (g (f a))
is equivalent to
newtype Compose g f a = O (g (f a))
Try it. Application is left-associative at the type-level just like value-level.
Also, is the Functor declaration really necessary? Seems like you can write
``` instance (Foldable f1, Foldable f2) => Foldable (Compose f1 f2) where foldr f start (O list) = foldr g start list where g = flip . foldr f
Looks to me the case too.
For the record, here's what's in Conal's TypeCompose 0.9.10:
-- These next two instances are based on suggestions from Creighton Hogg: instance (Foldable g, Foldable f, Functor g) => Foldable (g :. f) where -- foldMap f = fold . fmap (foldMap f) . unO foldMap f = foldMap (foldMap f) . unO -- fold (O gfa) = fold (fold <$> gfa) -- fold = fold . fmap fold . unO fold = foldMap fold . unO -- I could let fold default
-- Kim-Ee
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (3)
-
Julian Birch
-
Kim-Ee Yeoh
-
Tony Morris