module Main where import Prelude hiding(reverse) import Test.QuickCheck -- Basic definition of reverse reverse :: [a] -> [a] reverse [] = [] reverse (x:xs) = reverse xs ++ [x] -- Faster implementation of reverse revHelper :: [a] -> [a] -> [a] revHelper [] ys = ys revHelper (x:xs) ys = revHelper xs (x:ys) reverse2 :: [a] -> [a] reverse2 xs = revHelper xs [] -- reversing a string twice is identity prop_revrev :: [Int] -> Bool prop_revrev xs = reverse (reverse xs) == xs -- reverse2 is equivalent to reverse prop_revrev2 :: [Int] -> Bool prop_revrev2 xs = reverse2 xs == reverse xs -- revHelper is related to reverse and concatenation prop_revrevh :: [Int] -> [Int] -> Bool prop_revrevh xs ys = reverse xs ++ ys == revHelper xs ys main = do quickCheck prop_revrev quickCheck prop_revrev2 quickCheck prop_revrevh