用常量映射序列

时间:2011-03-04 05:20:46

标签: map clojure functional-programming constants sequence

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

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

其中my-constant-value是一个常量,因为它对于my-sequence的映射来说是相同的,尽管它本身可能是某些函数的结果。我觉得以后我会看看我在这里问的问题,并认为这是一个愚蠢的问题,因为如果我以不同的方式构建我的代码,这不会是一个问题,但它确实存在!

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

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

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

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

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

你会(可能吗?)需要重新定义my-function以将常量值作为第一个参数,并且你不需要接受可变数量的参数,因此使用partial不会买你什么。

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

(映射my-function my-sequence(常量my-constant-value))

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

编辑:这个答案是错误的,但是constantly和其他“其他有用的功能”api非常酷,我想把这里的引用留给他们。