Ich halte es für eine nicht so gute Idee, die Ausgabe mit in der Umwandlungsfunktion zu erledigen, da es dann keine "normale" Funktion mehr ist(Stattdessen hat sie dann als Rückgabetyp `IO String'), und du sie schlechter in anderen Berechnungen verwenden kannst. Stattdessen würde ich rome als Integer -> String umsetzen und die Ein/Ausgabe dann in main oder sonstwo erledigen.Wenn ich wieder Unsinn gebaut habe: Über konstruktive Verbesserungsvorschläge freue ich mich immer!
Hier noch eine Variante in Haskell, die ich noch auf der Platte rumliegen hatte(keine Prüfung auf ungültige Eingaben):
Code:
import Data.List
import Data.Ord
digits = [("A",5000),("MA",4000),("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)]
toRoman 0 = ""
toRoman d = let match = head $ filter ((<=d) . snd) digits
in fst match ++ (toRoman $ d - snd match)
toDec [] = 0
toDec str = let table = reverse $ sortBy (comparing (length . fst)) digits
match = head $ filter ((`isPrefixOf` str) . fst) table
in snd match + (toDec $ drop (length $ fst match) str)