Palindromic solution??

Date: Mon, 16 Feb 2009 16:32:23 +0100 From: Miguel Pignatelli
Subject: [Haskell-beginners] Indentation of local functions To: beginners@haskell.org Message-ID: <90C28A9E-A67D-47CA-8416-5F1C5C27A1F9@uv.es> Content-Type: text/plain; charset="us-ascii" Hi all,
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)
I'm trying to write the typical function that determines if a list is a palindrome. the typical answer would be something like:
isPalindrome xs = xs == (reverse xs)
But I find this pretty inefficient (duplication of the list and double of needed comparisons). So I tried my own version using just indexes:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j -- line 43 then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
But, when trying to load this in ghci it throws the following error:
xxx.hs:43:12: parse error (possibly incorrect indentation) Failed, modules loaded: none. (Line 43 is marked in the code)
I seems that the definition of isPalindrome' must be in one line. So, this works as expected:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
Is there any way to make the local definition of isPalindrome' more readable?
Any help in understanding this would be appreciated
Thanks in advance,
I have found one solution to your problem isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j -- line 43 then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False This loads without error but poses a second problem it generates an index too large exception. Alan Cameron

Yes, the index too large exception is a bug in my original code, it should check for "i >= j" instead of "i==j" Thanks, M; El 16/02/2009, a las 17:26, Alan Cameron escribió:
Date: Mon, 16 Feb 2009 16:32:23 +0100 From: Miguel Pignatelli
Subject: [Haskell-beginners] Indentation of local functions To: beginners@haskell.org Message-ID: <90C28A9E-A67D-47CA-8416-5F1C5C27A1F9@uv.es> Content-Type: text/plain; charset="us-ascii" Hi all,
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)
I'm trying to write the typical function that determines if a list is a palindrome. the typical answer would be something like:
isPalindrome xs = xs == (reverse xs)
But I find this pretty inefficient (duplication of the list and double of needed comparisons). So I tried my own version using just indexes:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j -- line 43 then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
But, when trying to load this in ghci it throws the following error:
xxx.hs:43:12: parse error (possibly incorrect indentation) Failed, modules loaded: none. (Line 43 is marked in the code)
I seems that the definition of isPalindrome' must be in one line. So, this works as expected:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
Is there any way to make the local definition of isPalindrome' more readable?
Any help in understanding this would be appreciated
Thanks in advance,
I have found one solution to your problem
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j -- line 43 then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
This loads without error but poses a second problem it generates an index too large exception.
Alan Cameron
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On 16 Feb 2009, at 17:26, Alan Cameron wrote:
Date: Mon, 16 Feb 2009 16:32:23 +0100 From: Miguel Pignatelli
Subject: [Haskell-beginners] Indentation of local functions To: beginners@haskell.org Message-ID: <90C28A9E-A67D-47CA-8416-5F1C5C27A1F9@uv.es> Content-Type: text/plain; charset="us-ascii" Hi all,
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)
I'm trying to write the typical function that determines if a list is a palindrome. the typical answer would be something like:
isPalindrome xs = xs == (reverse xs)
But I find this pretty inefficient (duplication of the list and double of needed comparisons). So I tried my own version using just indexes:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j -- line 43 then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
But, when trying to load this in ghci it throws the following error:
xxx.hs:43:12: parse error (possibly incorrect indentation) Failed, modules loaded: none. (Line 43 is marked in the code)
I seems that the definition of isPalindrome' must be in one line. So, this works as expected:
isPalindrome xs = isPalindrome' 0 (length xs) where isPalindrome' i j = if i == j then True else if (xs !! i) == (xs !! (j-1)) then isPalindrome' (i+1) (j-1) else False
Is there any way to make the local definition of isPalindrome' more readable?
Any help in understanding this would be appreciated
Thanks in advance,
Of note by the way – the new solution is less efficient than the old one, for each letter that it compares it must traverse the list to find the (j-1)'th element. We can get a nice efficient solution by simply using the take function: isPalindrome xs = take l xs == (take l $ reverse xs) where l = length xs `div` 2 Bob

On 16 Feb 2009, at 19:30, Dave Bayer wrote:
Here's a solution harder on the machine, easier on the brain:
isPalindrome :: Eq a => [a] -> Bool isPalindrome xs = and $ zipWith (==) xs $ reverse xs
Lets just tidy that up a little... isPalindrome = (and . zipWith (==)) <*> reverse But I don't see how either is easier on the brain than xs == reverse xs. Bob
participants (4)
-
Alan Cameron
-
Dave Bayer
-
Miguel Pignatelli
-
Thomas Davie