RosettaCodeData/Task/Roman-numerals-Decode/Haskell/roman-numerals-decode-4.hs
2019-09-12 10:33:56 -07:00

29 lines
627 B
Haskell

import Data.List (mapAccumL, isPrefixOf)
import Control.Arrow ((***))
romanValue :: String -> Int
romanValue =
let tr s (k, v) =
until (not . isPrefixOf k . fst) (drop (length k) *** (v +)) (s, 0)
in sum .
snd .
flip
(mapAccumL tr)
[ ("M", 1000)
, ("CM", 900)
, ("D", 500)
, ("CD", 400)
, ("C", 100)
, ("XC", 90)
, ("L", 50)
, ("XL", 40)
, ("X", 10)
, ("IX", 9)
, ("V", 5)
, ("IV", 4)
, ("I", 1)
]
main :: IO ()
main =
mapM_ (print . romanValue) ["MDCLXVI", "MCMXC", "MMVIII", "MMXVI", "MMXVII"]