错误的args(0)传递给:PersistentHashMap

The*_*y92 5 clojure

我是Clojure的新手,我正试图通过移植我的一个代码来学习它,但是我目前陷入了以下问题:

=> lineup
{:c b4|b4|b3|b3, :sg b6|b11|b6|b6, :sf b7|b5|b5|b5, :pf b3|b1|b1|b1, :pg b10|b10|b11|b10}
=> (validate-lineup lineup)
ArityException Wrong number of args (0) passed to: PersistentHashMap  clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)

这是功能:

(defn validate-lineup [lineup]
    (map (fn [position]
        ((hash-map (position 0)
            (map
                (fn [s] (.substring s 1))
                (str/split (position 1) #"\|"))
                ))
        ) lineup))
Run Code Online (Sandbox Code Playgroud)

我正在尝试产生类似以下结果的东西:

{:c {"4" "4" "3" "3"} :sg {"6" "11" "6" "6"} :sf {"7" "5" "5" "5"} ... }
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助,如果我不是以正确的"Lisp"方式写作,请教我如何.

Nik*_*zov 12

你的主要问题在这里:

(fn [position]
  ((hash-map (position 0)
             (map
               (fn [s] (.substring s 1))
               (str/split (position 1) #"\|")))))
Run Code Online (Sandbox Code Playgroud)

您创建哈希映射,然后将其称为函数(请注意之前的双括号hash-map).你可以删除它并得到这个:

(fn [position]
  (hash-map (position 0)
             (map
               (fn [s] (.substring s 1))
               (str/split (position 1) #"\|"))))
Run Code Online (Sandbox Code Playgroud)

这种方式validate-lineup会回来

({:c ("4" "4" "3" "3")} 
 {:sg ("6" "11" "6" "6")} 
 {:sf ("7" "5" "5" "5")} 
 {:pf ("3" "1" "1"` "1")} 
 {:pg ("10" "10" "11" "10")})
Run Code Online (Sandbox Code Playgroud)

但是你需要单个地图,而不是一系列地图.你可以合并它们:

(apply merge (validate-lineup lineup))
Run Code Online (Sandbox Code Playgroud)

一些建议:

使用subs而不是.substring:迭代map时(fn [s] (subs s 1))
使用destructuring

(fn [[key value]]
  (hash-map key
             (map
               (fn [s] (subs s 1))
               (str/split value #"\|"))))
Run Code Online (Sandbox Code Playgroud)

有一种利用into函数从对向量创建映射的简洁方法.因此,您可以转换lineup为对的向量,其中第一项对是键,第二项是数字列表:

(defn validate-lineup [lineup]
  (into {} (map (fn [[key value]]
                    [key
                     (map #(subs s 1) (str/split value #"\|"))])
             lineup)))
Run Code Online (Sandbox Code Playgroud)

您可以b4|b4|b3|b3通过re-seq解析数字序列:

user=> (re-seq #"\d+" "b1|b2|b3")
("1" "2" "3")
Run Code Online (Sandbox Code Playgroud)

最后你可以mapfor替换外部:

(defn validate-lineup [lineup]
  (into {} (for [[key value] lineup]
                [key (re-seq #"\d+" value)])))
Run Code Online (Sandbox Code Playgroud)