【问题标题】:Branching function composition: composition version of if/cond?分支函数组合:if/cond 的组合版本?
【发布时间】:2012-11-06 16:33:44
【问题描述】:

在 Clojure 中,有多种组合函数的选项。有组合函数:

  • 应用:用于“展开”参数
  • 部分:用于尚未给出的参数
  • 比较:通过多个函数传递连续结果
  • Juxt:用于将一个参数应用于多个函数

但是,AFAIK 没有包含分支的组合函数。是否有任何以分支方式组合函数的函数,例如 ifcond 的函数版本?

当然,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


    【解决方案1】:

    我不确定这是否与您正在寻找的内容直接匹配(对我来说,这个问题有点模糊),但您应该研究一下 Monads 和 Arrows。

    Monad 允许您将函数与特定的“绑定”函数链接在一起,该函数定义了如何链接它们。它可以执行某种 if/else 流水线操作,例如在 Maybe 和 Either monad 中,或者它可以模拟状态,例如在 State monad 中。

    Monad 内置在 Haskell(作为 monad)和 F#(作为“工作流”)中。我见过 Clojure (check this out for one) 的 monad 库,而且可能还有 Arrow 库。

    【讨论】:

    • 我将不得不进一步研究 Monads,它似乎以一种间接的方式可能是我正在寻找的东西。
    【解决方案2】:

    好吧,您可能会想出很多这样的组合模式,并问为什么这不在核心语言中。原因很明显,不可行。该语言的核心为您提供了构建此类模式的所有结构。这些功能更像是contrib 之类的东西,而不是语言的核心。

    就实现而言,它就像下面所示的那样简单:

    (defn condf [& args]
      (let [chain (partition 2 args)]
        (fn [& params]
          (first (for [[p f] chain :when (or (= :else p) (apply p params))]
                    (apply f params))))))
    
    (def my-func (condf string? clojure.string/trim 
                      vector? (partial apply str)
                      :else identity))
    
    (my-func "Ankur ") ==> "Ankur"
    (my-func [1 2 3]) ==> "123"
    (my-func '(1 2 3)) ==> (1 2 3)
    

    【讨论】:

    • 不完全同意你的论点,为什么不呢。没有分支功能组合,但有 comp 和 juxt。当然,它可以单独实现或导入(它可能最终会出现在我的标准 util lib 中),但在这种情况下,Clojure 将只包含 7 个表单。您提供的实现非常简洁,但我完全忘记了评估可能会与 :when 短路。
    • 嗯.. 我会说它有点主观,取决于语言设计者,他们对特定功能需求的感受
    【解决方案3】:

    这接近了战略规划的想法。您可能会发现以下感兴趣的论文

    战略规划的本质 by Ralf Lämmel、Eelco Visser 和 Joost Visser

    http://homepages.cwi.nl/~ralf/eosp/

    http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.20.1969

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多