
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