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"
是否可以使用 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"