【发布时间】:2012-02-24 02:17:21
【问题描述】:
过去几天我一直在使用 Haskell 数据类型,使用自定义类型来处理罗马数字:
数据 RomanNumeral = I |四 |五 |九 | X |加大码 |大号 | XC | C |光盘 | D |厘米 | M 推导(Eq、Ord、Show、Read)
stringToRomanNumeral :: String -> Maybe [RomanNumeral]
stringToRomanNumeral romString
|非罗马=没有
|否则 = 只需 $ map read $ map (\x -> [x]) romStringUpper
在哪里
romStringUpper = 映射 C.toUpper romString
unRoman = any (`notElem` "MDCLXVI") romStringUpper
这很好用,但只能捕获 1 个字符的数字(所以我必须稍后计算 IV、IX 等的值)。
有没有办法read(或reads)输入字符串,使得 Maybe [RomanNumeral] 的返回值也包含 2 个字符的数字?我尝试涉足模式匹配,但我似乎无法正确输入类型。
【问题讨论】:
-
如果您在数据类型中只有实际数字,例如 I、V、X、C、D、M - 您可以将完整数字表示为这些数字的列表。这会大大简化事情。
-
我最初的方法仅限于 I、V、X、C、D、M,而 stringToRomanNumeral 函数会返回这些项目。但是将 IV、IX 等作为单独的类型构造函数极大地简化了十进制数的转换(此处未显示)。
标签: haskell