2024年Clojure调查 中分享您的看法!

欢迎!请参阅 关于 页面以获取有关如何使用本网站的一些更多信息。

0
语法和读取器

我正在做罗马数字的Clojure练习。
我有
(def roman-numerals {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
并将“XVI”转换为数字 - 以此为起点。但是

(map #(println %) (sequence "XIV"))
输出
`X
(nilI
nilV
nil)`

(map #(get roman-numerals %) (sequence "XIV"))
结果是
(nil nil nil)

如何让映射使用序列中的实际字符?

(sequence "XIV") => (\X \I \V)

2 个回答

0

编辑过
 
最佳答案

尝试

(def roman-numerals {\M 1000 \D 500 \C 100 \L 50 \X 10 \V 5 \I 1})
(map roman-numerals "XVI")
;;=> (10 5 1)

如果您想保留字符串在映射中

(map #(roman-numerals (str %)) (sequence "XIV"))
by
对我来说,答案是 Clojure 中字符不是字符串,因此我需要使用字符键而不是字符串键。
0
by

字符可以用 str 来强制转换为字符串(任何东西都可以),所以一种方法是将字符串作为一个字符序列来操作,映射到字符串,然后再像以前一样在你的映射中查找。另一种选择是像之前提到的那样使用字符作为键。

(def roman-numerals
 {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
(defn unroman [numeral]
   (->> numeral
       (map (comp roman-numerals str))
       (reduce +)))

user> (unroman "XIV")
16
...