Advertisement
LukaRamu

Four

Sep 13th, 2014
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Main
  2. where
  3.  
  4. import Data.List (unwords)
  5. import Data.Char (toUpper)
  6. import Control.Exception (IOException, try)
  7.  
  8. minNum, maxNum :: Int
  9. minNum = 0
  10. maxNum = 99
  11.  
  12. minText, maxText :: String
  13. minText = show minNum
  14. maxText = show maxNum
  15.  
  16. parsingFailedText :: String
  17. parsingFailedText = unwords ["Not a number between", minText, "and", maxText]
  18.  
  19. getNumber :: IO Int
  20. getNumber = do result <- try (readLn :: IO Int) :: IO (Either IOException Int)
  21.                case result of
  22.                     Left ex   -> fail
  23.                     Right val -> if val >= minNum && val <= maxNum
  24.                                     then return val
  25.                                     else fail
  26.             where fail = do putStrLn parsingFailedText
  27.                             getNumber
  28.  
  29. capitalize :: String -> String
  30. capitalize (x:xs) = toUpper x : xs
  31.  
  32. numToStr :: Int -> String
  33. numToStr num
  34.     | num < 0   = error "Error: Number too small"
  35.     | num < 10  = digits !! digit
  36.     | num < 20  = teens  !! digit
  37.     | num < 100 = tens !! (num `div` 10) ++ "-" ++ if digit /= 0
  38.                                                       then digits !! digit
  39.                                                       else ""
  40.     | otherwise = error "Error: Number too big"
  41.     where digit  = num `mod` 10
  42.           digits = ["zero", "one", "two", "three", "four",
  43.                     "five", "six", "seven", "eight", "nine"]
  44.           teens  = ["ten", "eleven", "twelve", "thirteen", "fourteen",
  45.                     "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
  46.           tens   = ["zero", "ten", "twenty", "thirty", "forty",
  47.                     "fifty", "sixty", "seventy", "eighty", "ninety"]
  48.  
  49. compute :: Int -> IO ()
  50. compute num = do
  51.     let str    = capitalize . numToStr $ num
  52.     let newNum = length str
  53.     if num /= 4
  54.        then do putStrLn $ str ++ " is " ++ show newNum
  55.                compute newNum
  56.        else putStrLn "Four is the magic number"
  57.  
  58. main :: IO ()
  59. main = do putStrLn $ "Input a number between " ++ minText ++ " and " ++ maxText
  60.           num <- getNumber
  61.           compute num
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement