Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更好的clojure习惯用法,用于将FN序列映射到输入_Clojure - Fatal编程技术网

更好的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)<代码>,这是我认为在你不需要一个懒惰序列的情况下最习惯的。