clojure 是否对有关(fns)命名约定的任何作品开放,尤其是将类似通用的 fns 作为部分

is clojure open to whatever works regarding naming conventions (of fns), especially regarding generic-like fns as partials

我对函数式编程和 clojure 还很陌生。我喜欢。 我想知道社区对以下 fn 命名方法的看法: 这种命名方式是否可行,还是出于某种原因需要避免?

示例:

(defn coll<spec>?
  "Checks wether the given thing is a collection of elements of ::spec-type"
  [spec-type thing]
  (and (coll? thing)
       (every? #(spec/valid? spec-type %)
               thing)))

(defn coll<spec>?nil
  "Checks if the given thing is a collection of elements of ::spec-type or nil"
  [spec-type thing]
  (or (nil? thing)
      (coll<spec>? spec-type thing)))

现在 ... 我在其他地方使用 clojure 中的部分应用程序 defrecrod/specs ... 类似这样:

; somewhere inside a defrecord
^{:spec (partial p?/coll<spec>?nil ::widgets)} widgets component-widgets

现在,我为 colls、sets、hash-maps 创建了这个,具有类似通用形式的规范(spec/valid 的内部应用程序?...)并直接应用谓词和分别

而不是

目前我正在与我的同事讨论这是一种体面的、有意义的和有用的方法——因为在 clojure 中这样命名函数至少是有效的——或者社区是否认为这是一种不可行的方法.

我非常希望您对此发表有根据的意见。

这是一个奇怪的命名约定,但是很多项目都使用奇怪的命名约定,因为它们的作者认为它们有帮助。我想如果我阅读你的代码库,变量命名约定可能不会是最让我惊讶的事情。这不是侮辱:每个项目都有一些让我感到惊讶的东西。

但我完全不明白您为什么需要这些特定功能。正如 Sean Corfield 在评论中所说,有很好的规范组合器函数可以从更简单的规范中构建更高级的规范。您可以将 s/valid?s/coll-of:

结合使用,而不是编写 coll<spec>?
(s/valid? (s/coll-of spec-type) thing)

同样,您可以使用 s/ornil? 得出 coll<spec>?nil

(s/valid? (s/or nil? (s/coll-of spec-type) thing))

这显然比仅 coll<spec>?nil 要在每个调用站点上写的更多,因此您可以不理会我的建议。但重点是您可以提取用于定义这些规范的函数,并使用这些规范。

(defn nil-or-coll-of [spec]
  (s/or nil? (s/coll-of spec)))

(s/valid? (nil-or-coll-of spec-type) thing)

重要的是,这意味着您可以将 nil-or-coll-of 的结果传递给其他一些需要规范的函数,也许可以从中构建更大的规范,或者尝试符合它。如果您的所有功能都已 s/valid? 融入其中,您将无法做到这一点。

从组合通用函数的角度考虑,而不是为每件你想做的事情从头开始定义一个新函数。