Clojure:实现一些功能

Clojure: Implementing the some function

我是 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)))))

我可以想象还有更多惯用的方法。 有什么建议吗?

首先,您有一个错误:[[y & t] x] 解构了 x,但是以下 empty? 检查 t 意味着您忽略了序列中的最后一个元素。你可以用

看到这个
(my-some even? [2])
=> nil

您可以将 (if (empty? x) nil (else-form)) 替换为 whenseq:

(when (seq x) ...)

然后您可以使用 firstnext 来解构序列:

(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

进行比较