gpt4 book ai didi

clojure - 如何继承函数选项

转载 作者:行者123 更新时间:2023-12-02 17:11:53 27 4
gpt4 key购买 nike

我编写了这个从树中获取元素的函数。就是这样:

(defn at [address tree] (reduce nth tree address))

现在的问题是 nth 有 2 个重载;一种是在索引超出范围时抛出异常,另一种是采用 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 的角度提出这个问题的,但它可能适用于其他语言,也可能不适用于其他语言。

最佳答案

为什么按照nth的设计来设计at?调用 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 )。

关于clojure - 如何继承函数选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35661885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com