RosettaCodeData/Task/Roman-numerals-Decode/Haskell/roman-numerals-decode-4.hs

30 lines
627 B
Haskell
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
import Data.List (mapAccumL, isPrefixOf)
import Control.Arrow ((***))
2017-09-23 10:01:46 +02:00
2019-09-12 10:33:56 -07:00
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)
]
2017-09-23 10:01:46 +02:00
main :: IO ()
2019-09-12 10:33:56 -07:00
main =
mapM_ (print . romanValue) ["MDCLXVI", "MCMXC", "MMVIII", "MMXVI", "MMXVII"]