我编写了此函数,该函数从树中获取元素。就是这样:
(defn at [address tree] (reduce nth tree address))
现在的问题是nth
有两个重载。如果索引超出范围,则该异常将引发异常;而另一个则使用not-found
参数返回而不是引发异常。
现在,我可以为函数添加一个重载来添加此选项,如下所示:
(defn at [address tree not-found]
(reduce (fn [curr-tree index] (nth curr-tree index not-found))
tree address))
我可能会抱怨如何必须显式地创建一个新函数,而不是单纯地nth
使用它。
这不是真正的问题。我不必为每个nth
具有的重载都做一个重载。
nth
只有两个重载,但是在其他时候,我想编写类似包装器的函数时,如何将决策推迟给用户。在这个例子中,我只是包装nth
;为了保持一致,我想at
模仿的行为nth
。如何继承其他功能的选项?
我是从Clojure的角度提出这个问题,但它可能适用于或可能不适用于其他语言。
为什么要at
根据nth
的设计进行设计?不管谁打电话at
,都不应考虑nth
的重载。
at
可以通过@amalloy的答案中的函数来传递。但是我建议从更简单的设计开始,然后在需要时进行重构:
(defn at
([address tree]
(reduce nth tree address))
([address tree not-found]
(reduce #(nth %1 %2 not-found) tree address)))
我的基本原理是传递not-found
值比传递函数更容易理解:
(def maybe-x (at addr tree :bummer))
;; See @amalloy's answer
(def maybe-x (at' addr tree #(nth %1 %2 :bummer))))
实际上,如果以后需要传递其他函数,我将创建一个新at-by
函数(请参阅group-by)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句