最近一边看「Haskell 函数式编程入门」一边自学 Haskell。函数式编程对笔者这种受OOP毒害颇深(虽然我完全不会 Java,但是经常会被别人来自 Java 背景的_(:」∠))的菜鸟来说,还是很难适应的。想着目前主力语言是 C++,一种多范式编程语言,学习 Haskell 也算是自然而然吧。
学一门新语言还是很痛苦的,但是如果能做出什么的话还是很高兴的!废话就不多说了。
已知
罗马数字像是一种很有趣的五进制,说是五进制,但还不准确。在罗马数字中,i 为 1,v 为 5,x 为 10,l 为 50,c 为 100,但是 4、 9、40、90 分别用 iv、ix、xl、xc 来表示,将小一级的罗马数字放在左边表示减法。1∼10 罗马数字为:i、ii、iii、iv、v、vi、vii、viii、ix、x。
求解
在此笔者和「Haskell函数式编程入门」作者一样只考虑 5000 以内的罗马数字。首先将几个特殊的罗马数字和与之对应的十进制数放在一起:
romeNotation :: [String]
romeNotation =
["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X