blob: 4c895e810bfdc3a428599da8ef4e643667805fd4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
module Main where
import Data.Char (toLower, toUpper)
import Data.Foldable (forM_)
import Data.List (intercalate)
main :: IO ()
main = do
forM_ [One .. Nine] $ putStrLn . fourIsMagic
data Digit
= One
| Two
| Three
| Four
| Five
| Six
| Seven
| Eight
| Nine
deriving (Show, Eq, Ord, Enum)
toCardinal :: Digit -> String
toCardinal = lcFirst . show
fourIsMagic :: Digit -> String
fourIsMagic x = ucFirst $ intercalate ", " $ reverse $ go [] x
where
go acc Four = (toCardinal Four ++ " is magic.") : acc
go acc x =
let cardinal = toCardinal x
next = toEnum (length cardinal - 1)
in go ((cardinal ++ " is " ++ toCardinal next) : acc) next
lcFirst :: String -> String
lcFirst [] = []
lcFirst (x : xs) = toLower x : xs
ucFirst :: String -> String
ucFirst [] = []
ucFirst (x : xs) = toUpper x : xs
|