是否可以使用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)位吗?也就是说,根据映射中键的值在模式中有一个函数吗?
这是可能的,我知道我可以在向量上这样做,但是不能计算出语法,如果可能的话,用映射。
我知道我可以使用析构,但我想知道是否可以通过模式匹配。
谢谢
发布于 2019-10-14 01:38:40
虽然语法不同,但您可以在映射中使用卫兵。将模式包装在一个列表中,并追加: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"https://stackoverflow.com/questions/58368338
复制相似问题