【问题标题】:Declare dummy (unused) parameters for Clojure anonymous function为 Clojure 匿名函数声明虚拟(未使用)参数
【发布时间】:2017-01-28 11:15:48
【问题描述】:

正如答案of this question 中所解释的,Clojure 确定匿名函数的参数数量(通过#() 定义),由主体中引用的最大参数索引(例如,如果最大引用参数是@987654325 @,那么那个匿名函数有4个参数)。

问题:是否有一些语法可以告诉 Clojure 编译器匿名函数需要一个参数,即使不引用该参数?或者,在这种情况下,唯一的“干净方式”* 是使用 fn syntax? (*“干净的方式”:我知道在大多数情况下,您可以在不影响功能的情况下引用虚拟参数——见下文,但我想避免这种变通方法。)

我的用例:我有一个函数(defn foo [predicate]),其中predicate 只需要一个参数,我想用一个总是返回true 的谓词来测试foo。 (即,类似于#(true)。)这会导致ArityException,因为解释器认为#(true) 需要零参数。

在这种特殊情况下,我可以使用一些巧妙的技巧,例如 #(or true %),但是:

  1. 键入几乎与fn-variant 一样多。
  2. 如果有通用解决方案,我很感兴趣。

编辑:为了清楚起见,我正在寻找这样的东西:

#[1](true) ;; the anonymous function takes one parameter

【问题讨论】:

  • 关于具体问题,而不是一般问题 - Clojure 1.9 将包含您正在寻找的谓词 any?

标签: clojure arguments anonymous-function


【解决方案1】:

没有。只需使用fn。这就是它的用途。

【讨论】:

    【解决方案2】:

    如果它是一个恒定的回报,你可以使用constantly

    (map (constantly 10) '(1 2 3 4 5)) 
    ; ==> (10 10 10 10 10)
    

    如果不是,你可以使用 fn 和一个 rest 参数:

    (fn [& _] 
     some-side-effect-expression)
    ; ==> non functional value
    

    事实上,这可以在不需要所有传递参数的高阶函数上完成:

    (some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5))
    ; ==> (3 5 7 9)
    

    【讨论】:

      【解决方案3】:

      如果你坚持#( ... )语法,你可以写

      #(do % true)
      

      ...无论您想返回什么,都不会产生运行时损失。

      但是(constantly true),正如@Sylvester 所建议的那样,是惯用的,并且可以接受任何参数列表:

      ((constantly true) 1 2 "Buckle my shoe");true
      

      【讨论】:

        猜你喜欢
        • 2017-02-13
        • 2020-01-03
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多