Skip to content

Instantly share code, notes, and snippets.

@priort
Created September 18, 2016 19:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save priort/f0b30d5c8b4051d46e1d79abb3205c0f to your computer and use it in GitHub Desktop.
Save priort/f0b30d5c8b4051d46e1d79abb3205c0f to your computer and use it in GitHub Desktop.
module BeginningHaskellTalkExamples where
isPalindromeWithRecursion :: String -> Bool
isPalindromeWithRecursion str =
loop strEndIndex where
strEndIndex = length str - 1
loop i =
if (i <= (div strEndIndex 2)) then True
else if (str !! i) /= str !! (strEndIndex - i) then False
else loop (i - 1)
isPalindromeWithRecursionAndGuard :: (Eq a) => [a] -> Bool
isPalindromeWithRecursionAndGuard str =
loop strEndIndex where
strEndIndex = length str - 1
loop i
| i <= (div strEndIndex 2) = True
| (str !! i) /= str !! (strEndIndex - i) = False
| otherwise = loop (i - 1)
isPalindromeWithRecursionAndPatternMatch :: String -> Bool
isPalindromeWithRecursionAndPatternMatch str =
case str of
[] -> True
x : [] -> True
x1 : x2 : [] -> x1 == x2
x1 : xs -> x1 == last xs && isPalindromeWithRecursionAndPatternMatch (init xs)
--data Book =
-- Single String
-- | Trilogy String
-- | Series String
-- deriving (Show)
data Book =
Single { title :: String }
| Trilogy { title :: String }
| Series { title :: String }
deriving (Show)
b = Single { title = "hello"}
instance Eq Book where
(==) (Single t1) (Single t2) = t1 == t2
(==) (Trilogy t1) (Trilogy t2) = t1 == t2
(==) (Series t1) (Series t2) = t1 == t2
(==) _ _ = False
isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome [] = True
isPalindrome (x : []) = True
isPalindrome (x1 : x2 : []) = x1 == x2
isPalindrome (x1 : xs) = x1 == last xs && isPalindrome (init xs)
areAllPalindromesWithRecursion :: (Eq a) => [[a]] -> Bool
areAllPalindromesWithRecursion listOfLists =
loop listOfLists where
loop lOfl =
case lOfl of
[] -> True
(x : xs) -> isPalindrome x && loop xs
areAllPalindromesWithRefinedRecursion :: (Eq a) => [[a]] -> Bool
areAllPalindromesWithRefinedRecursion [] = True
areAllPalindromesWithRefinedRecursion (x : xs) = isPalindrome x && areAllPalindromesWithRefinedRecursion xs
areAllPalindromesWithFoldR :: (Eq a) => [[a]] -> Bool
areAllPalindromesWithFoldR lOfLs =
foldr (\x result -> isPalindrome x && result) True lOfLs
areAllPalindromesWithMapFoldComposed :: (Eq a) => [[a]] -> Bool
areAllPalindromesWithMapFoldComposed = foldr (&&) True . map isPalindrome
onlyPalindromes :: (Eq a) => [[a]] -> [[a]]
onlyPalindromes = filter isPalindrome
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment