ArityException при вызове count для ленивой последовательности - PullRequest
0 голосов
/ 16 декабря 2018

Я написал следующую функцию для определения, отличаются ли две строки точно на differing-char-no позиции символов.

(defn differ-by
    [id1 id2 differing-char-no]
    (let [zipped-ids (map vector (seq id1) (seq id2))
          differing-char-positions (filter #(not= %1 %2) zipped-ids)]
        (= differing-char-no (count differing-char-positions))))

Функция, однако, выдает ArityException при вызове.Исключением является вызов функции count, который говорит Wrong number of args (1) passed to: ....

При отладке кода я заметил, что и differing-char-positions, и zipped-ids - это ленивые последовательности, которые не были реализованы.Тем не менее, оценка (count zipped-ids) работает хорошо сразу, но (count differring-char-positions) работает только после вызова (count zipped-ids) один раз, то есть после того, как zipped-ids был реализован.Может ли кто-нибудь объяснить это поведение?Почему эти ленивые последовательности ведут себя по-разному?

1 Ответ

0 голосов
/ 16 декабря 2018

zipped-ids создает последовательность векторов, поэтому функция фильтра должна принимать один параметр:

(filter (fn [[a b]] (not= a b)) (map vector (seq [1 2 3]) (seq '(:a :b :c))))

Но есть лучший способ:

(filter (partial apply not=) (map vector (seq [1 2 3]) (seq '(1 :b :c))))

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