Project Euler Problem 17

http://projecteuler.net/index.php?section=problems&id=17
1から1000を英語で書いた場合の文字数

main = print $ length $ foldl1 (++) $ map toWords [1..1000]

toWords :: Int -> String
toWords 1000 = "one" ++ "thousand"
toWords n = let h = n `div` 100            --100の位の数
                t = (n `mod` 100) `div` 10 --10の位の数
                o = n `mod` 10             --1の位の数
            in (if h > 0 then toWord h ++ "hundred" ++ (if t > 0 || o > 0 then "and" else "") else "") ++
               (if t < 2 then toWord (t*10+o) else toWord (t*10) ++ toWord o)

toWord :: Int -> String
toWord 0 = ""
toWord 1 = "one"
toWord 2 = "two"
toWord 3 = "three"
toWord 4 = "four"
toWord 5 = "five"
toWord 6 = "six"
toWord 7 = "seven"
toWord 8 = "eight"
toWord 9 = "nine"
toWord 10 = "ten"
toWord 11 = "eleven"
toWord 12 = "twelve"
toWord 13 = "thirteen"
toWord 14 = "fourteen"
toWord 15 = "fifteen"
toWord 16 = "sixteen"
toWord 17 = "seventeen"
toWord 18 = "eighteen"
toWord 19 = "nineteen"
toWord 20 = "twenty"
toWord 30 = "thirty"
toWord 40 = "forty"
toWord 50 = "fifty"
toWord 60 = "sixty"
toWord 70 = "seventy"
toWord 80 = "eigthy"
toWord 90 = "ninety"
toWord n = error "toWord:undefined " ++ (show n)