我最近开始学习Haskell,目前正在尝试编写基本的Haskell函数。
我写了一个名为intToRoman
的函数,它可以将整数转换为罗马数字,它将整数列表中的数字(1,4,0,0-〉[1,4,0,0])进行除法运算,并将每个数字转换为罗马数字,同时考虑列表的长度,以确定何时是1000或100。
但是,它不会停止并检查零,例如,数字1400将返回:
MCD** Exception: Map.!: given key is not an element in the map
CallStack (from HasCallStack)
下面是代码本身:
mapInttoRoman:: M.Map Int String
mapInttoRoman = M.fromList
[(1,"I"),(4,"IV"),(5,"V"),(9,"IX"),(10,"X"),(40,"XL")
,(50,"L"),(100,"C"),(400,"CD"),(900,"CM"),(500,"D"),(1000,"M")]
listOfInt :: Int -> [Int]
listOfInt 0 = [ ]
listOfInt c = listOfInt(c`div`10) ++ [c`mod`10]
duplicate :: String -> Int -> String
duplicate string n = concat $ replicate n string
intToRoman :: Int -> String
intToRoman 0 = ""
intToRoman c = createInt x (len-1)
where x = listOfInt c
len = length x
createInt y xz = findRoman (head y) xz ++ createInt(drop 1 y)(xz-1)
where findRoman b l
| l < 1 = mapInttoRoman M.! b
| b == 0 = " "
| l == 3 = duplicate (mapInttoRoman M.! (10^l)) b
| b == 1 = mapInttoRoman M.! (10^l)
| otherwise = mapInttoRoman M.! (b*10^l)
2条答案
按热度按时间5fjcxozz1#
我认为你使用的算法是不正确的,你使它比它需要的更复杂。
此外,该列表不完整,我添加了90和900例。
看看这个代码..我认为它非常简单,你会很容易得到它。
试验:
gkl3eglg2#
这个怎么样?解释内嵌。