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))
替换为 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
进行比较
我是 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))
替换为 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