project euler problem 17

組み合わせの問題なので内包表記が大活躍する。
concatMapの方が読みやすいかもしれない。

main = print $ length $ concat one2thousand

one2nine = ["one","two","three","four","five","six","seven","eight","nine"]
zero2nine = "":one2nine
ten2nineteen = ["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"]
twenty2ninety = ["twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"]

one2ninetynine = one2nine ++ ten2nineteen ++ [x++y|x<-twenty2ninety,y<-"":one2nine]
onehundred2ninehundred  = [x++"hundred"++y|x<-one2nine,y<-"":["and"++z|z<-one2ninetynine]]
one2thousand = one2ninetynine++onehundred2ninehundred++["one"++"thousand"]