<div dir="ltr">Thanks for this response. the Monad instance for ((->) r) has been bugging me as well.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 21, 2017 at 6:32 AM, Rahul Muttineni <span dir="ltr"><<a href="mailto:rahulmutt@gmail.com" target="_blank">rahulmutt@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Olumide,<div><br></div><div>Let the types help you out.</div><div><br></div><div>The Monad typeclass (omitting the superclass constraints):</div><div><br></div><div>class Monad m where</div><div>  return :: a -> m a</div><div>  (>>=) :: m a -> (a -> m b) -> m b</div><div><br></div><div>Write out the specialised type signatures for (->) r:</div><div><br></div><div>{-# LANGUAGE InstanceSigs #-}</div><div>-- This extension allows you to specify the type signatures in instance declarations</div><span class=""><div><br></div><div>instance Monad ((->) r) where</div></span><div>  return :: a -> (r -> a)</div><div>  (>>=) :: (r -> a) -> (a -> (r -> b)) -> (r -> b)</div><div><br></div><div>Now we look at how to make some definition of return that type checks. We're given an a and we want to return a function that takes an r and returns an a. Well the only way you can really do this is ignoring the r and returning the value you were given in all cases! Because 'a' can be *anything*, you really don't have much else you can do! Hence:</div><div>  </div><div>  return :: a -> (r -> a)</div><div>  return a = \_ -> a</div><div><br></div><div>Now let's take a look at (>>=). Since this is a bit complicated, let's work backwards from the result type. We want a function that gives us a b given an r and given two functions with types (r -> a) and (a -> (r -> b)). To get a b, we need to use the second function. To use the second function, we must have an a, which we can get from the first function!</div><div><br></div><div>  (>>=) :: (r -> a) -> (a -> (r -> b)) -> (r -> b)</div><div>  (>>=) f g = \r -> (g (f r)) r</div><div><br></div><div>Hope that helps!</div><div>Rahul</div><div>  </div></div><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">On Tue, Feb 21, 2017 at 5:04 PM, Olumide <span dir="ltr"><<a href="mailto:50295@web.de" target="_blank">50295@web.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On 21/02/2017 10:25, Benjamin Edwards wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
What is it that you are having difficulty with? Is it "why" this is a<br>
good definition? Is it that you don't understand how it works?<br>
</blockquote>
<br></span>
I simply can't grok f (h w) w.<br>
<br>
- Olumide<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>
On Tue, 21 Feb 2017 at 10:15 Olumide <<a href="mailto:50295@web.de" target="_blank">50295@web.de</a><br></span><span>
<mailto:<a href="mailto:50295@web.de" target="_blank">50295@web.de</a>>> wrote:<br>
<br>
    Hello List,<br>
<br>
    I am having enormous difficulty understanding the definition of the bind<br>
    operator of ((->) r) as show below and would appreciate help i  this<br>
    regard.<br>
<br>
    instance Monad ((->) r) where<br>
         return x = \_ -> x<br>
         h >>= f = \w -> f (h w) w<br>
<br>
    Thanks,<br>
<br>
    - Olumide<br>
<br>
    ______________________________<wbr>_________________<br>
    Beginners mailing list<br></span>
    <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a> <mailto:<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a>><br>
    <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/beginners</a><span><br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/beginners</a><br>
<br>
</span></blockquote><div class="m_716382890466675817HOEnZb"><div class="m_716382890466675817h5">
<br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div class="m_716382890466675817gmail_signature" data-smartmail="gmail_signature">Rahul Muttineni</div>
</font></span></div>
<br>______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br></div>