我是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)))))
我可以想象还有更多惯用的方法。 有什么建议吗?
答案 0 :(得分:3)
首先,您有一个错误:[[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