【问题标题】:Pass a function with parameters as argument in Clojure在 Clojure 中传递带参数的函数作为参数
【发布时间】:2013-07-01 13:33:41
【问题描述】:

我有一个将函数集合作为参数的函数:

(defn- main-func
  [fn-list]
...)

我通常这样称呼它:

(main-func [f1 f2 ...])

但是f1f2 都是无参数函数。如何在此调用中包含带参数的函数? 我搜索了谷歌,但没有成功。谢谢

【问题讨论】:

  • 您可以使用包含参数的匿名函数来包装带有参数的函数,例如#(foo 1 2 3 4)。你的main-func 是否使用fn-list 来解决它们的副作用?
  • 它有效,谢谢。你能写一个答案以便我标记它吗? main-fun 不依赖于提供给它的函数的结果或效果。唯一的问题是必须在执行 main-func 中的某些代码之后执行。我做了一些测试,它似乎工作正常。
  • 当然。我问的原因是没有参数的纯函数函数只是常量。

标签: function parameters clojure higher-order-functions


【解决方案1】:

带参数的函数,例如

(defn foo [w x y z] ...)

可能被包含参数的匿名函数包装,例如

#(foo 1 2 3 4)

【讨论】:

  • 我认为(partial foo 1 2 3 4) 更规范?杰伊菲尔兹似乎知道他在说什么。 blog.jayfields.com/2012/10/…
  • @event_jr 感谢您的链接,读起来很有趣,但我不相信他的意思是避免每次使用匿名函数语法。这里的匿名函数看起来很自然,而对我来说,partial 选项在心理上表明需要提供额外的参数,但这里不是这种情况。请注意,(partial foo 1 2 3 4) 不是“无参数”函数,而是可变参数。
  • 函数可变参数的实际后果是什么?
  • 实用,如性能?从避免过早优化的角度来看,我无需担心,但是优化 (JIT) 编译器可以更轻松地将无参数纯函数替换为常量。一个是还是另一个不是,我不知道。这是一个口味问题——partial 对我来说意味着额外的论点。如果有额外的论点,我不会写#(foo 1 2 3 %) partial 是自然的,但我当然不会向后弯腰以避免#(foo 1 % 3 4)
  • 从心理上讲,我更喜欢(constantly (foo 1 2 3 4)) 而不是(partial (foo 1 2 3 4)),因为虽然两者都是可变参数,但第一个信号表明其他参数被忽略了。不过我个人还是会选择#(foo 1 2 3 4)
【解决方案2】:

除了 A. Webb 建议的 anon 函数外,您还可以使用函数partial,它给定一个 fn,创建另一个 fn,并设置一些参数。如果您指定所有参数,它将返回一个您可以不带参数调用的 fn:

 (def plus-12 (partial + 1 2))
 (plus-12) => 3
 (plus-12 3) => 6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2011-09-15
    • 2015-03-02
    相关资源
    最近更新 更多