<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jan 2, 2015 at 11:28 PM, Julian Birch <span dir="ltr"><<a href="mailto:julian.birch@gmail.com" target="_blank">julian.birch@gmail.com</a>></span> wrote:<br><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">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 = "</blockquote><div><br></div><div>Whatever's on the right of = got eaten by them gremlins, but<br><br><div>newtype (Compose g f) a = O (g (f a))<br><br></div><div>is equivalent to<br><br><div>newtype Compose g f a = O (g (f a))</div><br></div>Try it. Application is left-associative at the type-level just like value-level.<br></div><div><br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Also, is the Functor declaration really necessary?  Seems like you can write </div><div><br></div><div>```</div><div><div>instance (Foldable f1, Foldable f2) => Foldable (Compose f1 f2) where</div><div>  foldr f start (O list) = foldr g start list</div><div>    where g = flip . foldr f</div></div></blockquote></div><br></div><div class="gmail_extra">Looks to me the case too.<br><br></div><div class="gmail_extra">For the record, here's what's in Conal's TypeCompose 0.9.10:<br><br><pre><a name="line-226"></a><span class="">-- These next two instances are based on suggestions from Creighton Hogg: </span>
<a name="line-227"></a>
<a name="line-228"></a><span class="">instance</span> <span class="">(</span><span class="">Foldable</span> <span class="">g</span><span class="">,</span> <span class="">Foldable</span> <span class="">f</span><span class="">,</span> <span class="">Functor</span> <span class="">g</span><span class="">)</span> <span class="">=></span> <span class="">Foldable</span> <span class="">(</span><span class="">g</span> <span class="">:.</span> <span class="">f</span><span class="">)</span> <span class="">where</span>
<a name="line-229"></a>  <span class="">-- foldMap f = fold . fmap (foldMap f) . unO</span>
<a name="line-230"></a>  <span class="">foldMap</span> <span class="">f</span> <span class="">=</span> <span class="">foldMap</span> <span class="">(</span><span class="">foldMap</span> <span class="">f</span><span class="">)</span> <span class="">.</span> <span class="">unO</span>
<a name="line-231"></a>  <span class="">-- fold (O gfa) = fold (fold <$> gfa)</span>
<a name="line-232"></a>  <span class="">-- fold = fold . fmap fold . unO</span>
<a name="line-233"></a>  <span class="">fold</span> <span class="">=</span> <span class="">foldMap</span> <span class="">fold</span> <span class="">.</span> <span class="">unO</span>
<a name="line-234"></a>  <span class="">-- I could let fold default<br><br></span></pre></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">-- Kim-Ee</div></div>
</div></div>