Clojure には、関数の合成にいくつかのオプションがあります。次の合成関数があります。
- 適用: 「アンラップ」引数用
- 部分的: まだ与えられていない引数用
- Comp: 複数の関数を介して連続した結果をパイプするため
- Juxt: 複数の関数に 1 つの引数を適用するため
ただし、知る限り、分岐を含むそのような合成関数はありません。またはの機能バージョンのように、関数を分岐して構成する関数はあります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」の場合にデフォルトでIDを返すことが正しい選択であるか、またはそのような場合にnilを返す必要があるかどうかについての議論があるかもしれません。
このような関数を使用すると、より読みやすいコードを生成できます。代わりに#(if (string? %) (trim %) %)
、(iff string? trim)
または cond バージョンで:
(condf string? trim,
vector? (partial apply str),
:else identity)
他の FP 言語にはそのような構造がありますか? comp と juxt を使用したコンポジションで便利かもしれないと想像できます。なぜ Clojure は使わないのですか?
素敵な iff / condf 実装のボーナスポイント:)