【问题标题】:flip order of passed arguments传递参数的翻转顺序
【发布时间】:2016-02-21 19:48:47
【问题描述】:

是否有一种惯用/内置的方式来翻转传递给 Clojure 中函数的参数顺序?

就像我在这里定义一个辅助函数一样:

(defn flip [f & xs]
   (apply f (reverse xs)))


(vector 1 2)       ; [1 2]
(flip vector 1 2)  ; [2 1]

【问题讨论】:

  • 是的,有!你在你的问题中写了它。不过,我不太确定这在哪里有用。你能举个实际的例子吗?
  • 我正在使用一个二维向量,比如一个带有 x 轴和 y 轴的网格。然后我有一个在那个网格上运行的函数:这​​个函数在网格中的连续字段序列上运行,有时是垂直的,有时是水平的。为了让函数不用担心轴,我将(部分向量)或(部分翻转向量)传递给它。通过该子功能,该功能可以以更抽象的方式对网格进行操作。
  • 如果我在需要时交换网格中的 x 和 y 轴,也会发生同样的效果。嗯,我不确定这是否解释得很好......
  • 你能在你的问题中发布一个代码示例吗?
  • 好吧,我试着只提取相关部分。这里有一个要点:gist.github.com/antonharald/68bb0cbbebf964264270希望澄清翻转的需要。但也许还有其他方法..

标签: clojure functional-programming


【解决方案1】:

我认为大多数时候创建一个稍后使用的翻转函数是有意义的,所以你的函数的变化是这样的:

(defn flip [f]
  (fn [& xs]
    (apply f (reverse xs))))

【讨论】:

    【解决方案2】:

    翻转函数确实存在于其他函数式语言中,但在 Clojure 中也很容易做到,而且您已经做到了!

    也有other 的方法。

    here 是 Clojure 邮件列表中关于它的讨论。

    【讨论】:

      【解决方案3】:

      您也可以使用匿名内联函数重新定义参数的顺序。

      (vector "a" "b")          ; ["a" "b"]  
      (#(vector %2 %1) "a" "b") ; ["b" "a"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多