在Clojure中模拟nth

时间:2018-01-11 05:10:59

标签: clojure

The 21st 4clojure problem要求您实施nth

但是我试图实现它:

(defn my-nth
  ([s 0] (first s))
  ([s n] (recur s (- n 1))))

导致错误"不支持的绑定形式:0"

有人可以解释为什么这是错误以及如何修复它?

1 个答案:

答案 0 :(得分:1)

在函数的参数中,不能指定值,只能指定符号。也许,你从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(或默认值),要么以相反的顺序从集合的末尾开始;

  • 在未提供默认值时添加其他正文(未通过时将其设为nil);

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