1

是否可以使用 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)一点吗?即根据地图中键的值在模式中有一个功能吗?

这可能吗,我知道我可以在向量上执行此操作,但无法计算出语法或者是否可以使用地图。

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

谢谢

4

1 回答 1

1

您可以将守卫与地图一起使用,尽管语法不同。将模式包装在列表中并附加: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"
于 2019-10-14T01:38:40.083 回答