【问题标题】:Mapping over sequence with a constant用常数映射序列
【发布时间】:2011-07-08 13:57:08
【问题描述】:

如果我需要为要映射到序列项的函数提供常量值,有没有比我目前正在做的更好的方法:

(map my-function my-sequence (cycle [my-constant-value]))

其中 my-constant-value 是一个常数,因为它对于 my-sequence 上的映射将是相同的,尽管它本身可能是更远一些函数的结果。我有一种感觉,稍后我会看看我在这里问什么,并认为这是一个愚蠢的问题,因为如果我以不同的方式构建我的代码,那将不是问题,但它确实存在!

【问题讨论】:

    标签: map clojure functional-programming constants sequence


    【解决方案1】:

    在你的情况下,我会使用匿名函数:

    (map #(my-function % my-constant-value) my-sequence)
    

    使用部分应用的函数是另一种选择,但在这种特殊情况下没有多大意义:

    (map (partial my-function my-constant-value) my-sequence)
    

    您将(也许?)需要重新定义 my-function 以将常量值作为第一个参数,并且您不需要接受可变数量的参数,因此使用 partial 不会买你任何东西。

    【讨论】:

      【解决方案2】:

      我倾向于使用 dbyrne 建议的部分函数或匿名函数,但另一个需要注意的工具是 repeat,它会返回你想要的任何值的无限序列:

      (map + (range 4) (repeat 10))
      => (10 11 12 13)
      

      【讨论】:

        【解决方案3】:

        我发现有时比map 更具可读性的另一种方法是for 列表理解宏:

        (for [x my-sequence]
           (my-function x my-constant-value))
        

        【讨论】:

          【解决方案4】:

          是的 :) 来自 API constantly"other useful functions" 部分的小宝石

          (map my-function my-sequence (constantly my-constant-value))

          (map compines-data something-new a-constant) 的模式在 idomatic clojure 中相当常见。对于分块序列等,它也相对较快。

          编辑:这个答案是错误的,但是constantly 和其余的“其他有用的功能”api 太酷了,我还是想把参考留给他们。

          【讨论】:

          • 不断返回一个函数,而不是一个序列:clojure.core/repeat ([x] [n x]) Returns a lazy (infinite!, or length n if supplied) sequence of xs.
          猜你喜欢
          • 2014-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多