更好的clojure习惯用法,用于将FN序列映射到输入
我在我的代码更好的clojure习惯用法,用于将FN序列映射到输入,clojure,Clojure,我在我的代码(map#(%a)fns)中经常遇到这种模式,其中a是一个变量,比如一个字符串,fns是fns的一个序列,比如[count#(split)”,”。有没有更简洁的方式来表达这种模式?更简洁?可能不会。更好的成语?视情况而定juxt将任意数量的FN作为参数,并提供一个与其并置的函数。所以,你可以用它来代替你的地图 (def a "foo,bar,baz") (map #(% a) [count #(split % #",")]) ;=> (11 ["foo" "bar" "baz
(map#(%a)fns)
中经常遇到这种模式,其中a是一个变量,比如一个字符串,fns是fns的一个序列,比如[count#(split)”,”
。有没有更简洁的方式来表达这种模式?更简洁?可能不会。更好的成语?视情况而定juxt
将任意数量的FN作为参数,并提供一个与其并置的函数。所以,你可以用它来代替你的地图
(def a "foo,bar,baz")
(map #(% a) [count #(split % #",")])
;=> (11 ["foo" "bar" "baz"])
((juxt count #(split % #",")) a)
;=> [11 ["foo" "bar" "baz"]]
一方面,您有一个懒惰的应用程序序列,另一方面,您有功能组合。哪个更好取决于需要。一种简单的表达方式:(对于[f fns](f A))
仅为完整性而添加,它与基于映射的表达式一样好,除非你喜欢而不是匿名函数。模式已经很简洁了。但是,如果您想创建一个表示函数集合的抽象,并且它也是可调用的,您可以尝试以下方法:
(defmacro function-coll [param-count]
(let [params (repeatedly param-count gensym)
name (symbol (str "Functions-" param-count))]
`(deftype ~name [fns#]
clojure.lang.IFn
(invoke [_ ~@params] (map #(% ~@params) fns#)))))
(function-coll 1)
(def one-fns (->Functions-1 [inc dec]))
(one-fns 10)
(function-coll 2)
(def two-fns (->Functions-2 [str vector]))
(two-fns :hello :world)
我认为这里需要鹅口疮操作员
user=> (-> "a b c d"
.toUpperCase
(.replace "A" "X")
(.split " ")
first)
"X"
OOP,我错过了一个SQ的FNS的要求。为了完整性,在你的情况下,它将是<代码>((应用Juxt FNS)A)<代码>,这是我认为在你不需要一个懒惰序列的情况下最习惯的。