<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><div><div>Hi all,<div><br></div><div>This is my first post in this forum, I'm pretty new to Haskell (although I have some previous experience in functional programming with OCaml).</div><div><br></div><div>I'm trying to write the typical function that determines if a list is a palindrome.</div><div>The typical answer would be something like:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">isPalindrome xs = xs == (<span style="color: rgb(64, 192, 192); ">reverse</span>&nbsp;xs)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">But I find this pretty inefficient (duplication of the list and double of needed comparisons).</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">So I tried my own version using just indexes:</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">isPalindrome xs =</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span>isPalindrome' 0 (<span style="color: rgb(64, 192, 192); ">length</span>&nbsp;xs)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(0, 0, 196); ">where</span>&nbsp;isPalindrome' i j =</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(0, 0, 196); ">if</span>&nbsp;i == j &nbsp; -- line 43</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(0, 0, 196); ">then</span>&nbsp;True</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(0, 0, 196); ">else</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(0, 0, 196); ">if</span>&nbsp;(xs !! i) == (xs !! (j-1))</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(0, 0, 196); ">then</span>&nbsp;isPalindrome' (i+1) (j-1)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(0, 0, 196); ">else</span>&nbsp;False</div><div><br></div><div>But, when trying to load this in ghci it throws the following error:</div><div><br></div><div><div>xxx.hs:43:12: parse error (possibly incorrect indentation)</div><div>Failed, modules loaded: none.</div><div>(Line 43 is marked in the code)</div><div><br></div><div>I seems that the definition of isPalindrome' must be in one line. So, this&nbsp;works as expected:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">isPalindrome xs =</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span>isPalindrome' 0 (<span style="color: rgb(64, 192, 192); ">length</span>&nbsp;xs)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;&nbsp;<span style="color: rgb(0, 0, 196); ">where</span>&nbsp;isPalindrome' i j =&nbsp;<span style="color: rgb(0, 0, 196); ">if</span>&nbsp;i == j&nbsp;<span style="color: rgb(0, 0, 196); ">then</span>&nbsp;True&nbsp;<span style="color: rgb(0, 0, 196); ">else</span>&nbsp;<span style="color: rgb(0, 0, 196); ">if</span>&nbsp;(xs !! i) == (xs !! (j-1))&nbsp;<span style="color: rgb(0, 0, 196); ">then</span>&nbsp;isPalindrome' (i+1) (j-1)&nbsp;<span style="color: rgb(0, 0, 196); ">else</span>&nbsp;False</div><div><br></div></div><div>Is there any way to make the local definition of isPalindrome' more readable?</div><div><br></div><div><div>Any help in understanding this would be appreciated</div><div><br></div><div>Thanks in advance,</div><div><br></div><div>M;</div><div><br></div></div></div></div></div></div></div></div></div></div></body></html>