【发布时间】:2012-11-06 16:33:44
【问题描述】:
在 Clojure 中,有多种组合函数的选项。有组合函数:
- 应用:用于“展开”参数
- 部分:用于尚未给出的参数
- 比较:通过多个函数传递连续结果
- Juxt:用于将一个参数应用于多个函数
但是,AFAIK 没有包含分支的组合函数。是否有任何以分支方式组合函数的函数,例如 if 或 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),或者使用条件版本:
(condf string? trim,
vector? (partial apply str),
:else identity)
其他 FP 语言有这样的结构吗?我可以想象它在与 comp 和 juxt 的组合中可能会很方便。为什么不使用 Clojure?
不错的 iff / condf 实现加分 :)
【问题讨论】:
标签: clojure functional-programming