Hi all:<div>     I am a newbie of haskell and I&#39;m reading &quot;<a href="http://www.haskell.org/all_about_monads/html/">All about Monads</a>&quot; right now, I have some question about the example shows in Chapter 2, it says that following code is ugly</div>
<div><br></div><div><span class="Apple-style-span" style="font-family: simsun, simsun, sans-serif; font-size: medium; "><br class="Apple-interchange-newline"></span><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><span class="Apple-style-span" style="white-space: normal; "><pre style="font-family: simsun, simsun, sans-serif !important; ">
mothersPaternalGrandfather :: Sheep -&gt; Maybe Sheep
mothersPaternalGrandfather s = case (mother s) of
                                 Nothing -&gt; Nothing
                                 Just m  -&gt; case (father m) of
                                              Nothing -&gt; Nothing
                                              Just gf -&gt; father gf</pre></span></span></font></div><div><br></div><div>and after intruduce the comb function, it become more cleaner:</div><div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><span class="Apple-style-span" style="white-space: pre; "><br class="Apple-interchange-newline">
-- comb is a combinator for sequencing operations that return Maybe
comb :: Maybe a -&gt; (a -&gt; Maybe b) -&gt; Maybe b
comb Nothing  _ = Nothing
comb (Just x) f = f x

-- now we can use `comb` to build complicated sequences
mothersPaternalGrandfather :: Sheep -&gt; Maybe Sheep
mothersPaternalGrandfather s = (Just s) `comb` mother `comb` father `comb` father </span></span></font></div><div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br>
</span></font></div><div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;">my question is, why not define the function father and mother as type of father::Maybe Sheep -&gt; Maybe Sheep? this can also</span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;">clean the code and it avoid the additional function comb</span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;">further more, why we need a function =&gt; with type of =&gt; m a -&gt; ( a -&gt; m b ) -&gt; mb? define some function with type m a -&gt; m b can solve these problems too.</span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;">Thanks and BR </span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font></div>
<div><font class="Apple-style-span" face="simsun, simsun, sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: medium;"><br></span></font><br>
</div>