Core.match 在映射键/值上有守卫

Core.match with guards on a map key / value

是否可以使用 core.match 执行以下操作(愚蠢的示例):

  (defn summaries-film [film]
     (match film
         {:genre "Horror" :budget :guard #(< % 1000000) :star _} "Low budget horror"
         {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
         {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
         :else "Some other film"))

??

我希望能够在地图上进行模式匹配,但是有 :guard #(< % 10000) 位吗?即在基于映射中键值的模式中具有函数?

这可能吗,我知道我可以通过向量来做到这一点,但无法计算出语法或者如果可能的话使用地图。

我知道我可以使用解构,但我想知道是否可以使用模式匹配。

谢谢

您可以将 guards 用于地图,但语法不同。将模式包装在列表中并附加 :guard your-guard-fn。守卫函数将与整个地图一起调用,假设模式匹配,否则:

({:foo 1} :guard #(= 1 (:foo %)))

你的例子是这样的:

(defn summaries-film [film]
  (match film
    ({:genre "Horror" :budget _ :star _} :guard #(< (:budget %) 100)) "Low budget horror"
    {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
    {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
    :else "Some other film"))

(summaries-film {:genre "Horror" :budget 1 :star "Kelsey Grammer"})
;=> "Low budget horror"
(summaries-film {:genre "Horror" :budget 101 :star "Robert Forster"})
;=> "Some other film"