Clojure:实现某些功能

时间:2018-12-06 11:51:59

标签: clojure break tail-recursion

我是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 :(得分:3)

首先,您有一个错误:[[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

进行比较