2013年10月21日月曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の12章(新しいクラスのオブジェクト), 12.6(練習問題の続き)、roman_to_integer 'mcmxcix'!をHaskellで解いてみる。

その他参考書籍

romanToInteger

コード(BBEdit)

sample.hs

{-# OPTIONS -Wall -Werror #-}

import qualified Data.Char as Char
import qualified Data.Map as Map

main :: IO ()
main = do
    mapM_ putStrLn $ map (\x -> x ++ ": " ++ 
                                (eitherToString $ romanToInteger x))
                         ["abcde", "mcmxcix", "MCMXCIX"]

eitherToString :: Either String Integer -> String
eitherToString (Left a) = a
eitherToString (Right a) = (show a)

romanToInteger :: String -> Either String Integer
romanToInteger xs =
    romanCharToInteger xs 0 0

romanIntMap :: Map.Map Char Integer
romanIntMap = Map.fromList $
    [('m', 1000),
     ('d', 500),
     ('c', 100),
     ('l', 50),
     ('x', 10),
     ('v', 5),
     ('i', 1)]

romanCharToInteger :: String -> Integer -> Integer -> 
    Either String Integer
romanCharToInteger [] _ b = Right b
romanCharToInteger xs a b =
    let c = Char.toLower $ last xs
        d = init xs
        e = Map.lookup c romanIntMap
    in case e of
            Nothing -> Left "有効なローマ数字ではない!"
            Just f -> if f >= a
                      then romanCharToInteger d f (b + f)
                      else romanCharToInteger d a (b - f)

入出力結果(Terminal, runghc)

$ runghc sample.hs
abcde: 有効なローマ数字ではない!
mcmxcix: 1999
MCMXCIX: 1999
$

0 コメント:

コメントを投稿