Haskell中有“继续”吗?

时间:2017-10-11 16:39:44

标签: haskell

我最近开始学习Haskell,目前正在尝试编写基本的Haskell函数。

我编写了一个名为intToRoman的函数,它应该将整数转换为罗马数。它将整数列表中的数字除以(1400 - > [1,4,0​​,0]),并将每个数字转换为罗马数字,并将其计入列表的帐户长度,以确定何时是一千或一百。

但是,它也不会停止并检查零。例如,数字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)

1 个答案:

答案 0 :(得分:0)

我认为您使用的算法不正确,并且使它变得比所需的更加复杂。

列表还不完整,我增加了90和900个案例。

看看这段代码..我认为它很简单,您会很容易得到它。

import qualified Data.Map as M

    mapInttoRoman:: M.Map Int String
    mapInttoRoman = M.fromList
              [(1,"I"),(4,"IV"),(5,"V"),(9,"IX"),(10,"X"),(40,"XL")
              ,(50,"L"),(90,"XC"),(100,"C"),(400,"CD"),(500,"D"),(900,"CM"),(1000,"M")]

    intToRoman :: Int -> String
    intToRoman 0 = ""
    intToRoman n | M.member n mapInttoRoman = mapInttoRoman M.! n
                 | otherwise = val ++ intToRoman (n-key) 
                 where
                    keys = reverse (M.keys mapInttoRoman)
                    key  = maxValidKey n keys
                    val  = mapInttoRoman M.! key
                    maxValidKey n (k:ks) 
                      | n >= k = k
                      | otherwise = maxValidKey n ks 

测试:

enter image description here