首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中有"continue“吗?

在Haskell中有"continue“吗?
EN

Stack Overflow用户
提问于 2017-10-12 00:39:44
回答 1查看 1.1K关注 0票数 4

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

我已经写了一个名为intToRoman的函数,它可以将整数转换为罗马数字。它将整数列表( 1400 ->1,4,0,0)中的数字除以,并将每个数字转换为罗马数字,同时考虑到列表的帐户长度,以确定何时是千或百。

但是,它也不会停止并检查零。例如,数字1400将返回:

代码语言:javascript
复制
 MCD** Exception: Map.!: given key is not an element in the map
 CallStack (from HasCallStack)

下面是代码本身:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2020-03-01 04:09:31

我认为你使用的算法是不正确的,而且你让它变得比需要的更复杂。

而且列表也不完整,我添加了90和900个案例。

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

代码语言:javascript
复制
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 

测试:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46693478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档