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 <ky3@atamo.com> wrote:
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

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners