Haskell中实现字符转罗马数字:如何在Map中按键查找值?
在Haskell中使用Map进行查找操作
1. 导入Map模块
Haskell的Map功能位于Data.Map模块中,通常用限定导入避免命名冲突:
import qualified Data.Map as Map
2. 创建罗马数字映射Map
将字符数字与罗马数字的对应关系,通过Map.fromList从列表转换为Map实例:
digitToRoman :: Map.Map Char String digitToRoman = Map.fromList [ ('1', "I") , ('2', "II") , ('3', "III") , ('4', "IV") , ('5', "V") , ('6', "VI") , ('7', "VII") , ('8', "VIII") , ('9', "IX") ]
3. 常用的查找方法
方法一:Map.lookup(返回Maybe类型)
该函数返回Maybe String类型——找到对应键时返回Just 罗马数字,键不存在时返回Nothing,适合需要处理无效输入的场景:
-- 查找存在的键 Map.lookup '3' digitToRoman -- 结果:Just "III" -- 查找不存在的键(如'0') Map.lookup '0' digitToRoman -- 结果:Nothing
方法二:Map.findWithDefault(指定默认值)
若能确保输入是1-9的有效字符,或想给无效输入设置默认返回值,可使用此函数。它接受三个参数:默认值、要查找的键、目标Map:
-- 查找有效键 Map.findWithDefault "" '5' digitToRoman -- 结果:"V" -- 查找无效键,返回指定默认值 Map.findWithDefault "无效数字" '0' digitToRoman -- 结果:"无效数字"
完整示例函数
结合上述内容,可写出简单的转换函数:
import qualified Data.Map as Map digitToRoman :: Map.Map Char String digitToRoman = Map.fromList [ ('1', "I"), ('2', "II"), ('3', "III"), ('4', "IV"), ('5', "V") , ('6', "VI"), ('7', "VII"), ('8', "VIII"), ('9', "IX") ] convertToRoman :: Char -> String convertToRoman c = Map.findWithDefault "输入必须是1-9的字符数字" c digitToRoman
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

