String 字符串上的Clojure映射

String 字符串上的Clojure映射,string,map,clojure,higher-order-functions,String,Map,Clojure,Higher Order Functions,我在Clojure被难住了。我正在尝试编写一个系统,该系统基于简单的成对编码规则来转换字符串的某些字符:[“a”“B”]是将“a”转换为“B”的规则 我有一个函数“apply rules to char”,它接受这样一个规则和一个char的向量,找到匹配的第一个规则并应用它。它似乎起作用了 (apply-rules-to-char [["A" "B"]] "C") produces "C" (apply-rules-to-char [["A" "B"]] "A") produces "B"

我在Clojure被难住了。我正在尝试编写一个系统,该系统基于简单的成对编码规则来转换字符串的某些字符:[“a”“B”]是将“a”转换为“B”的规则

我有一个函数“apply rules to char”,它接受这样一个规则和一个char的向量,找到匹配的第一个规则并应用它。它似乎起作用了

(apply-rules-to-char [["A" "B"]] "C")  produces "C"
(apply-rules-to-char [["A" "B"]] "A")  produces "B"
(apply-rules-to-char [["A" "B"]] "M")  produces "M"
但是,当我现在尝试使用map在字符串中应用此项时

(map (partial apply-rules-to-char [["A" "B"]]) "CAM")
我回来了

(\C \A \M)
换句话说,它通过字符串“CAM”运行,但没有对“A”进行转换

有人能解释为什么会这样吗

更新:下面是对char应用规则的定义。我猜这是不相关的,因为它在自己测试时总是正确执行。只有在地图上它才失败

(defn apply-rules-to-char [rules c]
  (let [rule (first (filter #(applicable % c) rules))]
    (if (nil? rule) c (apply-rule-to-char rule c) )  ))

apply rules to char
函数似乎想要一个字符串(例如
“a”
),而不是一个字符(例如
\a
),这是字符串的组成部分。换句话说,您的函数需要能够作为
(将规则应用于char[[“A”“B”]]\A)
,因为这是它将从
映射中获得的。。所以单个字符不等于长度为1的字符串?@interstar:no。字符是与字符串不同的类型。