On Sat, Nov 24, 2012 at 10:32 PM, Mark Wallace <span dir="ltr">&lt;<a href="mailto:lotabout@gmail.com" target="_blank">lotabout@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div class="HOEnZb"></div></blockquote>&gt; Somehow it might seem a bit easier to me to grasp the function of a function with the help of type signature. I&#39;ll try just omitting the signatures, it&#39;s easier and more handy isn&#39;t it?<div>

<br></div><div>The unspoken wisdom goes something like this: the classic top-down FP way of coding has you sketch out most if not all of your function signatures. So when you hit the keyboard, a very natural thing to do is to key in all those signatures stubbing out definitions using &quot;undefined&quot;. You proceed from there.<br>

<div class="HOEnZb"></div><div><br></div><div>Sometimes people just use haskell as a calculator on steroids, especially when solving project-euler-type problems. In which case, anything goes. Needless to say, if all the practice a beginner gets is project euler, they&#39;re missing out a lot.</div>

<div><br></div><div><br></div><div>-- Kim-Ee<br>
<br><br><div class="gmail_quote">On Sat, Nov 24, 2012 at 10:32 PM, Mark Wallace <span dir="ltr">&lt;<a href="mailto:lotabout@gmail.com" target="_blank">lotabout@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">On 11/24/2012 11:07 PM, Daniel Fischer wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Samstag, 24. November 2012, 22:04:15, Mark Wallace wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I&#39;m writing a merge sort function, but I get type error under such<br>
implementation:<br>
<br>
     mergesort :: (a -&gt; a -&gt; Ordering) -&gt; [a] -&gt; [a]<br>
     mergesort cmp xs = mergeAll (map (\x -&gt; [x]) xs)<br>
          where<br>
            mergeAll :: [[a]] -&gt; [a]<br>
            mergeAll [x] = x<br>
            mergeAll xs = mergeAll (mergePairs xs)<br>
<br>
            mergePairs :: [[a]] -&gt; [[a]]<br>
            mergePairs (a:b:xs) = merge a b : mergePairs xs<br>
            mergePairs xs = xs<br>
<br>
            merge :: [a] -&gt; [a] -&gt; [a]<br>
            merge as@(a:as&#39;) bs@(b:bs&#39;)<br>
<br>
                | cmp a b == GT = b : merge as bs&#39;<br>
                | otherwise     = a : merge as&#39; bs<br>
<br>
            merge [] bs = bs<br>
            merge as [] = as<br>
<br>
And ghc says:<br>
<br>
          Couldn&#39;t match type `a1&#39; with `a&#39;<br>
            `a1&#39; is a rigid type variable bound by<br>
                 the type signature for merge :: [a1] -&gt; [a1] -&gt; [a1]<br>
                 at<br>
     /home/ice/Study/Haskell/<u></u>tutorials/99Questions/21to30.<u></u>hs:135:7<br>
            `a&#39; is a rigid type variable bound by<br>
                the type signature for<br>
                  mergesort :: (a -&gt; a -&gt; Ordering) -&gt; [a] -&gt; [a]<br>
                at<br>
     /home/ice/Study/Haskell/<u></u>tutorials/99Questions/21to30.<u></u>hs:124:1<br>
          In the first argument of `cmp&#39;, namely `a&#39;<br>
          In the first argument of `(==)&#39;, namely `cmp a b&#39;<br>
          In the expression: cmp a b == GT<br>
<br>
But if I comment all type signatures, ghc works fine on it.<br>
I would really appreciate it if you can point out what causes this<br>
question?<br>
</blockquote>
Type variables are implicitly for all-quantified. Thus the type variable a in<br>
the signatures of the local functions is a fresh type variable and has nothing<br>
to do with the a from the top-level signature.<br>
<br>
It is equivalent to you writing<br>
<br>
     merge :: [b] -&gt; [b] -&gt; [b]<br>
<br>
except there it is obvious that the type signature is wrong.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And how to fix it without changing the structure of the program (i.e. not<br>
</blockquote>
adding function `cmp&#39; as a parameter of `merge&#39; etc.).<br>
<br>
1. Just omit the type signatures, they can be inferred.<br>
<br>
That&#39;s the portable way.<br>
<br>
2. Bring the type variable a into scope<br>
<br>
     {-# LANGUAGE ScopedTypeVariables #-}<br>
<br>
     mergesort :: forall a. (a-&gt; a-&gt; Ordering) -&gt; [a] -&gt; [a]<br>
<br>
then an (unquantified) a in a local type signature refers to the type from the<br>
top-level signature.<br>
<br>
That&#39;s a GHC-only (as far as I know) way.<br>
</blockquote></div></div>
Thanks for answering so fast. And all of your answers are very helpful.<br>
I&#39;ve tested these two solutions, all works fine.<br>
Now I understand how type signature works in such condition.<br>
<br>
Somehow it might seem a bit easier to me to grasp the function of a function with the help of type signature.<br>
I&#39;ll try just omitting the signatures, it&#39;s easier and more handy isn&#39;t it?<div class="HOEnZb"><div class="h5"><br>
<br>
______________________________<u></u>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/<u></u>mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br></div></div>