Haskellians,<br><br>i am delighted to see vigorous exchange that actually resulted in change of positions. i confess i was going to give up, but glad others stepped into the breach. This is yet another indication of what an unusual community this is. 
<br><br>Best wishes,<br><br>--greg<br><br>Date: Fri, 3 Aug 2007 13:43:32 +1200<br>From: ok &lt;<a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:ok@cs.otago.ac.nz">ok@cs.otago.ac.nz</a>&gt;<br>Subject: Re: RE [Haskell-cafe] Monad Description For Imperative
<br>To: haskell-cafe Cafe &lt;<a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:haskell-cafe@haskell.org">haskell-cafe@haskell.org</a>&gt;<br>Message-ID: &lt;<a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:8575BD1C-2113-4D48-A3D4-BDFF41238BB9@cs.otago.ac.nz">
8575BD1C-2113-4D48-A3D4-BDFF41238BB9@cs.otago.ac.nz</a>&gt;<br>Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed<br><br>I asked &quot;How is IO a functor&quot;?<br><br>On 3 Aug 2007, at 11:50 am, Dan Piponi wrote:
<br>&gt; IO is a fully paid up Monad in the categorical sense. The category is<br>&gt; the category whose objects are types and whose arrows are functions<br>&gt; between those types. IO is a functor. The object a maps to IO a. An
<br>&gt; arrow f::a-&gt;b maps to (&gt;&gt;= return . f)::IO a -&gt; IO b and that can be<br>&gt; used to make IO an instance of Functor. The natural transforms eta and<br>&gt; mu are called return and join.<br><br><br>Please go over this again, but slowly this time.
<br>You have convinced me, but I&#39;d like to understand the details a little<br>better.<br><br>I see that any type constructor TC :: * -&gt; * is halfway to being a<br>functor<br>on this category of types. &nbsp;It acts on the objects in the obvious way,
<br>so the next step is to see about the arrows.<br><br> &nbsp; &nbsp;If f :: a -&gt; b then we want TC f :: TC a -&gt; TC b<br><br>such that TC (f . g) = TC f . TC g and TC (id::a-&gt;a) = id :: TC a -&gt;<br>TC a<br><br>Now this is precisely the Haskell Functor class, so TC is the object
<br>part<br>and fmap is the arrow part. &nbsp;You say that (&gt;&gt;= return . f) can be<br>used to<br>make [a Monad] an instance of Functor. &nbsp;Try it... by golly it&#39;s true.<br>I see: &nbsp;fmap f = (&gt;&gt;= return . f).<br><br>
So why *aren&#39;t* Monads already set up using the type class machinery<br>to always *be* Functors in Haskell? &nbsp;Isn&#39;t it bound to confuse people<br>if monads are functors but Monads are not Functors?<br><br>This is especially puzzling because Maybe, [], and IO already *are*
<br>Functors, but the way this is done makes it look accidental, not like<br>the fundamental property of Monads it apparently is.<br><br>(By the way, I note that the on-line documentation for Control.Monad<br>glosses<br>&nbsp;&gt;&gt;= as &quot;Sequentially composes two actions...&quot;.)
<br><br clear="all"><br>-- <br>L.G. Meredith<br>Managing Partner<br>Biosimilarity LLC<br>505 N 72nd St<br>Seattle, WA 98103<br><br>+1 206.650.3740<br><br><a href="http://biosimilarity.blogspot.com">http://biosimilarity.blogspot.com
</a>