Отображение строки с использованием карты - PullRequest
1 голос
/ 11 октября 2019
(def conversions {"G" "C"
                  "C" "G"
                  "T" "A"
                  "A" "U"})

(defn to-rna [dna]
  (map conversions dna)
)

(conversions "G") ;; Gives "C"

(to-rna "GC")     ;; Gives (nil nil)

Я пытаюсь выполнить упражнение, где я конвертирую буквы. У меня есть рабочее решение, но оно мне не нравится. Я чувствую, что вышесказанное должно сработать, но, очевидно, я ошибаюсь, потому что это не так.

Может ли кто-нибудь объяснить мне, почему это так, и как я могу должным образом добиться этого?

Ответы [ 4 ]

5 голосов
/ 11 октября 2019

Как говорит dpassen, вам нужно поместить java.lang.Character на карту, а не строку длины 1. Попробуйте это:

(def conversions { \G  \C
                   \C  \G
                   \T  \A
                   \A  \U })
5 голосов
/ 11 октября 2019

При отображении на строку она будет обрабатываться как последовательность символов. Итак, ваш код в конечном итоге ищет запись \ G и \ C на карте, которые оба возвращают nil.

4 голосов
/ 12 октября 2019

Я только начинаю изучать Clojure, поэтому, пожалуйста, принимайте этот ответ с осторожностью.

В дополнение к тому, что уже было предложено, я бы поместил карту конверсий в форму let, чтобы сохранить вашу функцию "изолированный». (Как и ваша функция полагается на conversions, определяемый вне ее области действия.)

Я также прочитал (не могу вспомнить, где именно), что общее соглашение об именах при написании функций, которые "конвертируют" Xдля Y должно быть указано следующее: x->y.

Наконец, я бы использовал макропоток для улучшения читаемости.

(defn dna->rna [dna]
  (let [conversions {\G \C
                     \C \G
                     \T \A
                     \A \U}]
    (->> dna
         (map conversions)
         (string/join ""))))

(dna->rna "GC")
;; "CG"
2 голосов
/ 11 октября 2019

К вашему сведению, у Clojure есть clojure.string / escape и clojure.string / replace, которые вы, возможно, захотите посмотреть. побег, вероятно, наиболее похож на то, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...