AAh! Thanks a ton!<br><br>Hemanth K<br><br><div class="gmail_quote">On Jan 7, 2008 12:10 AM, Rodrigo Queiro &lt;<a href="mailto:overdrigzed@gmail.com">overdrigzed@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
You have used the name &#39;pos&#39; twice, for both the parameter and the<br>returned value of the recursive call. The reason this results in an<br>infinite loop is that in code like<br><br>let x = x + 1<br><br>Haskell treats both xs to be references to the same thing, so evaluates:
<br>x<br>= x + 1<br>= (x + 1) + 1<br>= ((x + 1) + 1) + 1<br>...<br><br>which results in the infinite loop.<br><div><div></div><div class="Wj3C7c"><br>On 06/01/2008, Sai Hemanth K &lt;<a href="mailto:saihemanth@gmail.com">
saihemanth@gmail.com</a>&gt; wrote:<br>&gt; Hi,<br>&gt;<br>&gt; I am new to functional and lazy programming languages ( that&#39;s correct, my<br>&gt; life has been pretty pathetic so far) and am not able to understand GHC&#39;s
<br>&gt; behaviour for a particular function. Can someone help me please?<br>&gt;<br>&gt; I am trying to write a function which would compare two strings (from<br>&gt; reverse) and return the position of first mismatch. This is part of the
<br>&gt; right-to-left scan of bayer-moore algorithm.. and it is essential for me to<br>&gt; do it from reverse.<br>&gt; Since my goal is to learn haskell, I am not using Data.ByteString.<br>&gt;<br>&gt; My function is as follows:
<br>&gt;<br>&gt; matchReverse :: String -&gt; String -&gt;Int-&gt;(Bool,Int)<br>&gt; matchReverse [] [] pos = (True,pos)<br>&gt; matchReverse _ [] pos = (False,pos)<br>&gt; matchReverse [] _ pos = (False,pos)<br>&gt; matchReverse (x:xs) (y:ys) pos = let (matched,pos) = matchReverse xs ys (pos
<br>&gt; +1)<br>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in if matched then<br>&gt; ((x==y),pos)<br>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else (False,pos)<br>&gt;<br>&gt;<br>&gt;<br>&gt; The behaviour I expected in four scenarios is as below:
<br>&gt; 1.matchReverse &quot;kapilash&quot; &quot;kapilash&quot; 0 &nbsp; &nbsp; --should return (True,0)<br>&gt; 2.matchReverse &quot;kapilash&quot; &quot;kapilast&quot; 0 &nbsp; &nbsp; --should return (False,8)<br>&gt; 3.matchReverse str1 str2 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--should return (False,0)
<br>&gt; 4.matchReverse str1 str1 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--should return (True,0)<br>&gt;<br>&gt; where str1 and str2 are defined as below:<br>&gt; &nbsp;str1 = &nbsp;replicate 1000 &#39;a&#39;<br>&gt; &nbsp;str2 = &nbsp;&#39;b&#39;:(replicate 999 &#39;a&#39;)
<br>&gt;<br>&gt; what confounds me is that it is able to identify the first element of the<br>&gt; tuple in ALL the cases.<br>&gt; Invoking fst on the each of the four calls instantly returns the expected<br>&gt; value.(even for the cases 3 and 4 where, there are thousand elements)
<br>&gt; But it seems to go into an infinite loop while calculating the &#39;snd&#39; of the<br>&gt; tuple. Even for strings containing just one element each.<br>&gt; can someone throw some light on this please? Why does it go into an infinite
<br>&gt; loop?<br>&gt;<br>&gt; Many thanks<br>&gt; Kapilash<br>&gt;<br>&gt;<br>&gt; --<br>&gt; I drink I am thunk.<br></div></div>&gt; _______________________________________________<br>&gt; Haskell-Cafe mailing list<br>&gt; 
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>&gt;
<br>&gt;<br></blockquote></div><br><br clear="all"><br>-- <br>I drink I am thunk.