在 Clojure 中,有多种组合函数的选项。有组合功能:
- 应用:用于“展开”参数
- 部分:对于尚未给出的论点
- Comp:用于通过多个函数传递连续结果
- Juxt:用于在多个函数上应用一个参数
但是,AFAIK 没有包含分支的此类组合功能。是否有任何以分支方式组成函数的函数,例如if
or的函数版本cond
?
当然,一个 if 版本很容易制作(尽管这个实现可能不是最快的):
(defn iff
([pred rtrue] (iff pred rtrue identity))
([pred rtrue rfalse]
(fn [& args]
(if (apply pred args)
(apply rtrue args)
(apply rfalse args)))))
可能会讨论默认情况下在“else”情况下返回身份是正确的选择,或者在这种情况下是否应该返回 nil。
使用此类功能可以生成更易于阅读的代码。取而代之的是#(if (string? %) (trim %) %)
,(iff string? trim)
或带有 cond 版本:
(condf string? trim,
vector? (partial apply str),
:else identity)
其他 FP 语言有这样的结构吗?我可以想象它在与 comp 和 juxt 的组合中可能会很方便。为什么没有 Clojure ?
好的 iff / condf 实现的奖励积分:)