Clojure映射字符串

时间:2014-05-13 23:31:33

标签: 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"
(apply-rules-to-char [["A" "B"]] "M")  produces "M"

然而,当我现在尝试在字符串中应用它时,使用map

(map (partial apply-rules-to-char [["A" "B"]]) "CAM")

我回来了

(\C \A \M)

换句话说,它通过字符串“CAM”运行,但没有对“A”进行转换。

任何人都能解释为什么会这样吗?

更新:这是apply-rules-to-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) )  ))

1 个答案:

答案 0 :(得分:3)

您的apply-rules-to-char函数似乎需要一个字符串(例如"A"),而不是字符(例如\A),这就是字符串的组成部分。换句话说,您的函数需要能够以(apply-rules-to-char [["A" "B"]] \A)的形式工作,因为它将从map获得。