Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main
- where
- import Data.List (unwords)
- import Data.Char (toUpper)
- import Control.Exception (IOException, try)
- minNum, maxNum :: Int
- minNum = 0
- maxNum = 99
- minText, maxText :: String
- minText = show minNum
- maxText = show maxNum
- parsingFailedText :: String
- parsingFailedText = unwords ["Not a number between", minText, "and", maxText]
- getNumber :: IO Int
- getNumber = do result <- try (readLn :: IO Int) :: IO (Either IOException Int)
- case result of
- Left ex -> fail
- Right val -> if val >= minNum && val <= maxNum
- then return val
- else fail
- where fail = do putStrLn parsingFailedText
- getNumber
- capitalize :: String -> String
- capitalize (x:xs) = toUpper x : xs
- numToStr :: Int -> String
- numToStr num
- | num < 0 = error "Error: Number too small"
- | num < 10 = digits !! digit
- | num < 20 = teens !! digit
- | num < 100 = tens !! (num `div` 10) ++ "-" ++ if digit /= 0
- then digits !! digit
- else ""
- | otherwise = error "Error: Number too big"
- where digit = num `mod` 10
- digits = ["zero", "one", "two", "three", "four",
- "five", "six", "seven", "eight", "nine"]
- teens = ["ten", "eleven", "twelve", "thirteen", "fourteen",
- "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
- tens = ["zero", "ten", "twenty", "thirty", "forty",
- "fifty", "sixty", "seventy", "eighty", "ninety"]
- compute :: Int -> IO ()
- compute num = do
- let str = capitalize . numToStr $ num
- let newNum = length str
- if num /= 4
- then do putStrLn $ str ++ " is " ++ show newNum
- compute newNum
- else putStrLn "Four is the magic number"
- main :: IO ()
- main = do putStrLn $ "Input a number between " ++ minText ++ " and " ++ maxText
- num <- getNumber
- compute num
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement