module Roman.Decode
( fromRoman
) where
import Data.Char
fromRoman :: Integral a => String -> a
fromRoman a =
fromRoman' $ map toUpper a
where
fromRoman' (x:y:ys)
| fromRoman'' x < fromRoman'' y =
fromRoman'' y fromRoman'' x + fromRoman' ys
| otherwise =
fromRoman'' x + fromRoman' (y:ys)
fromRoman' (x:xs) =
fromRoman'' x + fromRoman' xs
fromRoman' _ =
0
fromRoman'' :: Integral a => Char -> a
fromRoman'' 'I' =
1
fromRoman'' 'V' =
5
fromRoman'' 'X' =
10
fromRoman'' 'L' =
50
fromRoman'' 'C' =
100
fromRoman'' 'D' =
500
fromRoman'' 'M' =
1000
fromRoman'' _ =
0