Clojure: реализация некоторой функции - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в clojure и пытался реализовать функцию some (для некоторых конкретных тестов):

(my-some even? [1 2 3 4]) => true

(my-some #{3 4} [1 2 3 4]) => 3

(my-some zero? [1 2 3 4]) => nil

Вот что я придумал до сих пор:

(defn my-some [f x]
 (loop [[y & t] x]
  (if (empty? t) nil
   (if (f y)
    (f y)
   (recur t)))))

Я мог бы представить, что есть более идиоматические подходы.Есть предложения?

1 Ответ

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

Во-первых, у вас есть ошибка: [[y & t] x] уничтожает x, но следующая проверка empty? на t означает, что вы игнорируете последний элемент в последовательности.Вы можете увидеть это с помощью

(my-some even? [2])
=> nil

. Вы можете заменить (if (empty? x) nil (else-form)) на when и seq:

(when (seq x) ...)

, а затем использовать first и next длядеконструируйте последовательность:

(defn my-some [f x]
  (when (seq x)
    (if (f (first x))
      (f (first x))
      (recur f (rest x)))))

вызов recur возвращается в my-some, поэтому вам нужно передать предикат f.

, который можно заменить (if x x (else ....)) на(or x (else ...)):

(defn my-some [f x]
  (when (seq x)
    (or (f (first x)) (recur f (next x)))))

Вы можете сравнить это с implementation of some

...