----------------------------------------------------------------------- -- Derived from -- -- Haskell: The Craft of Functional Programming -- Simon Thompson -- (c) Addison-Wesley, 1996-2010. -- -- Pictures.hs -- -- An implementation of a type of rectangular pictures -- using lists of lists of characters. ----------------------------------------------------------------------- import Test.QuickCheck type Picture = [String] larr :: Picture larr = [" # ", " ## ", "#####", " ## ", " # "] uarr :: Picture uarr = [" # ", " ### ", "#####", " # ", " # "] flipH :: Picture -> Picture flipH = reverse flipV :: Picture -> Picture flipV pic = [ reverse line | line <- pic] rarr :: Picture rarr = flipV larr darr :: Picture darr = flipH uarr above :: Picture -> Picture -> Picture above = (++) beside :: Picture -> Picture -> Picture beside pic1 pic2 = [ line1 ++ line2 | (line1,line2) <- zip pic1 pic2] -- Test properties prop_aboveFlipV pic1 pic2 = flipV (pic1 `above` pic2) == (flipV pic1) `above` (flipV pic2) prop_aboveFlipH pic1 pic2 = flipH (pic1 `above` pic2) == (flipH pic1) `above` (flipH pic2) -- Displaying pictures: render :: Picture -> String render pic = concat [line ++ "\n" | line <- pic] pr :: Picture -> IO() pr pic = putStr(render pic) -- Chessboards bSq :: Picture bSq = replicate 5 (replicate 5 '#') wSq :: Picture wSq = replicate 5 (replicate 5 ' ') alterH :: Picture -> Picture -> Integer -> Picture alterH pic1 pic2 1 = pic1 alterH pic1 pic2 n = pic1 `beside` alterH pic2 pic1 (n-1) alterV :: Picture -> Picture -> Integer -> Picture alterV pic1 pic2 1 = pic1 alterV pic1 pic2 n = pic1 `above` alterV pic2 pic1 (n-1) chessboard n = alterV bw wb n where bw = alterH bSq wSq n wb = alterH wSq bSq n