On Fri, Jan 2, 2015 at 11:28 PM, Julian Birch <julian.birch@gmail.com> 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