Difference between revisions of "99 questions/Solutions/6"
From HaskellWiki
< 99 questions  Solutions
Danwizard208 (talk  contribs) (One more variation) 

Line 49:  Line 49:  
<haskell> 
<haskell> 

palindrome :: (Eq a) => [a] > Bool 
palindrome :: (Eq a) => [a] > Bool 

−  +  palindrome xs = foldr (&&) True $ zipWith (==) xs (reverse xs) 

</haskell> 
</haskell> 
Revision as of 01:52, 29 November 2011
(*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x).
isPalindrome :: (Eq a) => [a] > Bool
isPalindrome xs = xs == (reverse xs)
isPalindrome' [] = True
isPalindrome' [_] = True
isPalindrome' xs = (head xs) == (last xs) && (isPalindrome' $ init $ tail xs)
Here's one to show it done in a fold just for the fun of it. Do note that it is less efficient then the previous 2 though.
isPalindrome'' :: (Eq a) => [a] > Bool
isPalindrome'' xs = foldl (\acc (a,b) > if a == b then acc else False) True input
where
input = zip xs (reverse xs)
Another one just for fun:
isPalindrome''' :: (Eq a) => [a] > Bool
isPalindrome''' = Control.Monad.liftM2 (==) id reverse
Or even:
isPalindrome'''' :: (Eq a) => [a] > Bool
ispalindrome'''' = (==) Control.Applicative.<*> reverse
Here's one that does half as many compares:
palindrome :: (Eq a) => [a] > Bool
palindrome xs = p [] xs xs
where p rev (x:xs) (_:_:ys) = p (x:rev) xs ys
p rev (x:xs) [_] = rev == xs
p rev xs [] = rev == xs
Here's one using foldr and zipWith.
palindrome :: (Eq a) => [a] > Bool
palindrome xs = foldr (&&) True $ zipWith (==) xs (reverse xs)