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中模拟nth_Clojure - Fatal编程技术网

在Clojure中模拟nth

在Clojure中模拟nth,clojure,Clojure,要求您实现nth 然而,我试图实现它: (defn my-nth ([s 0] (first s)) ([s n] (recur s (- n 1)))) 导致不支持的绑定表单出现错误:0 有人能解释一下为什么会出现这种错误以及如何修复它吗?在函数的参数中,不能指定值,只能指定符号。也许,你从Haskell那里借用了这种语法,你可以在那里做到这一点。但不是在Clojure 在您的示例中,代码如下所示: (defn nth-my [coll index not-found] (if

要求您实现nth

然而,我试图实现它:

(defn my-nth
  ([s 0] (first s))
  ([s n] (recur s (- n 1))))
导致不支持的绑定表单出现错误:0


有人能解释一下为什么会出现这种错误以及如何修复它吗?

在函数的参数中,不能指定值,只能指定符号。也许,你从Haskell那里借用了这种语法,你可以在那里做到这一点。但不是在Clojure

在您的示例中,代码如下所示:

(defn nth-my [coll index not-found] 
  (if (zero? index)
    (if (empty? coll)
      not-found
      (first coll))
    (recur (rest coll) (dec index) not-found)))
用法:

user> (nth-my [1 2 3] 0 "dunno")
1
user> (nth-my [1 2 3] 1 "dunno")
2
user> (nth-my [1 2 3] 2 "dunno")
3
user> (nth-my [1 2 3] 4 "dunno")
dunno
欢迎您通过以下方式进行改进:

检查负指数;立即返回nil或default,或从集合末尾开始,顺序相反

如果未提供默认值,则添加一个额外的主体;如果未通过,则将其设置为零

可能使用循环/重现形式来避免每次都传递最后一个默认参数


有一些语言可以进行任意模式匹配来路由函数调用,但Clojure并不是没有第三方扩展的语言之一,因为这些第三方扩展将伪造您所寻找的内容。不过,一般来说,您可以为不同数量的参数提供实现,但不能提供值匹配的参数。