Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:实现some函数_Clojure_Break_Tail Recursion - Fatal编程技术网

Clojure:实现some函数

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

我是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])
=> 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。这就是我一直在寻找的。我的解决方案实际上只是为了测试用例。无论如何,我更喜欢你的一般解决方案。