Clojure:实现some函数
我是clojure的新手,尝试实现该功能(针对某些特定测试): 到目前为止,我就是这么想的:Clojure:实现some函数,clojure,break,tail-recursion,Clojure,Break,Tail Recursion,我是clojure的新手,尝试实现该功能(针对某些特定测试): 到目前为止,我就是这么想的: (defn my-some [f x] (loop [[y & t] x] (if (empty? t) nil (if (f y) (f y) (recur t))))) 我可以想象有更多的惯用方法。 有什么建议吗?首先,您有一个错误:[[y&t]x]解构x,但是下面的为空?检查t意味着您忽略了序列中的最后一个元素。你可以看到这个 (my-some even? [2
(defn my-some [f x]
(loop [[y & t] x]
(if (empty? t) nil
(if (f y)
(f y)
(recur t)))))
我可以想象有更多的惯用方法。
有什么建议吗?首先,您有一个错误:
[[y&t]x]
解构x
,但是下面的为空?
检查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
的调用随后返回到mysome
,因此需要传递谓词f
您可以用(或x(其他…)
替换(如果x x(其他…))
:
您可以将其与进行比较首先,您有一个错误:
[[y&t]x]
解构x
,但是下面的为空?
检查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
的调用随后返回到mysome
,因此需要传递谓词f
您可以用(或x(其他…)
替换(如果x x(其他…))
:
您可以将此与@amalloy进行比较,请随意推荐CR上的OP帖子,但在将来,请不要将代码审查网站的存在作为结束问题的理由。评估请求并使用一个理由,比如过于宽泛,主要是基于意见的,等等。然后你可以向OP提到,如果是,它可以发布在代码审查上。请参见在@S中不应执行的操作部分ᴀᴍ在…上ᴇᴌᴀ 注意。在这种情况下,这似乎是一个合理的话题,因此,我收回我的投票。@amalloy可以自由推荐CR上的OP帖子,但在未来,请不要以代码审查网站的存在作为结束问题的理由。评估请求并使用一个理由,比如过于宽泛,主要是基于意见的,等等。然后你可以向OP提到,如果是,它可以发布在代码审查上。请参见在@S中不应执行的操作部分ᴀᴍ在…上ᴇᴌᴀ 注意。在这种情况下,这似乎是合理的话题,所以,我收回我的投票。好的观点。谢谢你的澄清。不知道下一个fn。这就是我一直在寻找的。我的解决方案实际上只是为了测试用例。不管怎样,我更喜欢你的一般解决方案。很好。谢谢你的澄清。不知道下一个fn。这就是我一直在寻找的。我的解决方案实际上只是为了测试用例。无论如何,我更喜欢你的一般解决方案。