<div class="gmail_quote">On Dec 14, 2007 4:18 PM, Felipe Lessa &lt;<a href="mailto:felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="Ih2E3d"><br></div>If it is&nbsp;not, the implementation &quot;fmap f = id&quot; is really the only one sound,<br>right?<br></blockquote><div><br></div><div>It pretty clear what you meant here, but it&#39;s worth noting that &quot;fmap f = id&quot; is a type error.
</div><div><br class="webkit-block-placeholder"></div><div>Consider:</div><div><br class="webkit-block-placeholder"></div><div>&nbsp;&nbsp; &nbsp;id :: a -&gt; a</div><div>&nbsp;&nbsp; &nbsp;(\Val i -&gt; Val i) :: Val a -&gt; Val b</div><div><br class="webkit-block-placeholder">
</div><div>These can (and, if Val is a newtype, will) be compiled to the same code, but they don&#39;t have the same type. In particular, there is no way to unify &quot;a -&gt; a&quot; with &quot;f a -&gt; f b&quot; for any f.
</div><div><br class="webkit-block-placeholder"></div><div>And yes, I&#39;m pretty sure that&#39;s the only possible implementation for that type which satisfies the functor laws.</div></div><br>-- <br>Dave Menendez &lt;<a href="mailto:dave@zednenem.com">
dave@zednenem.com</a>&gt;<br>&lt;<a href="http://www.eyrie.org/~zednenem/">http://www.eyrie.org/~zednenem/</a>&gt;