開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の10章(章全部で復習), 10.5(練習問題続き)、拡張 english_numberをHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
拡張 english umber
コード(BBEdit)
sample.hs
{-# OPTIONS -Wall -Werror #-}
main :: IO ()
main = do
line <- getLine
if line == ""
then return ()
else do
let n = read line :: Integer
putStrLn $ englishNumber n
main
englishNumber :: Integer -> String
englishNumber a
| a < 0 = "自然数(0から)を指定してください"
| a == 0 = "zero"
| a < 100 =
let ones_place = ["one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"]
tens_place = ["ten", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"]
teenagers = ["eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "nineteen"]
b = div a 10
c = a - 10 * b
inner :: Integer -> Integer -> String
inner 0 0 = ""
inner d 0 = index (d - 1) tens_place
inner 0 d = index (d - 1) ones_place
inner 1 d = index (d - 1) teenagers
inner d e = index (d - 1) tens_place ++
'-':(index (e - 1) ones_place)
in inner b c
| otherwise =
let others :: [(Integer, String)]
others = [(2, "hundred"),
(3, "thousand"),
(6, "million"),
(9, "billion"),
(12, "trillion"),
(15, "quandrillion"),
(18, "quintillion"),
(21, "sextillion"),
(24, "septillion")]
inner :: Integer -> [(Integer, String)] -> String
inner b [] = englishNumber b
inner b c =
let d = last c
e = init c
f = fst d
g = snd d
h = 10 ^ f
i = div b h
j = b - h * i
inner1 :: Integer -> Integer -> String
inner1 0 _ = ""
inner1 k 0 = englishNumber k ++ ' ':g
inner1 k _ = englishNumber k ++ ' ':g ++ " "
in (inner1 i j) ++ (inner j e)
in inner a others
index :: Integer -> [a] -> a
index n (x:xs)
| n == 0 = x
| otherwise = index (n - 1) xs
index _ [] = error "空っぽ"
入出力結果(Terminal, runghc)
$ runghc sample.hs 1 one 5 five 10 ten 15 fifteen 25 twenty-five 12345 twelve thousand three hundred forty-five 1234567890123456789012345 one septillion two hundred thirty-four sextillion five hundred sixty-seven quintillion eight hundred ninety quandrillion one hundred twenty-three trillion four hundred fifty-six billion seven hundred eighty-nine million twelve thousand three hundred forty-five $
0 コメント:
コメントを投稿