Integer to RomanNumeral in Haskell

Posted by okkez Tue, 05 Jun 2007 16:47:00 GMT

意味があるかどうかわからないけど、なんとなく書いてみた。

戦略は Erlang の場合と同じ。なんとなく Erlang の時よりすっきりしている気がしなくもない。

convert.hs
main = putStrLn $ unlines $ map i2r [1..4999] old_roman_unit :: Int -> Char old_roman_unit n | n == 1000 = 'M' | n == 500 = 'D' | n == 100 = 'C' | n == 50 = 'L' | n == 10 = 'X' | n == 5 = 'V' | n == 1 = 'I' | otherwise = 'Q' -- 本当は例外?を投げたい気がする i2r :: Int -> String i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] [] i2r2 :: Int -> [Int] -> String -> String i2r2 _ [] str = str i2r2 n (u:us) str = i2r2 (n `mod` u) us (str ++ replicate (n `div` u) (old_roman_unit u))

最後の行がちょっと微妙な気がする。誰か Haskell っぽく書くとこうなるってのを教えてくれるとうれしい。

今度逆も書いてみる。

Posted in | コメントはありません | タグ | atom

Comments

Leave a response

Leave a comment