为什么匹配地图时匹配子句顺序很重要?



给定xy,两者都旨在匹配具有相同匹配子句的映射。唯一的区别在于子句的顺序:

(ns so.example
(:require
[clojure.core.match :refer [match]]))
(defn x [m]
(match m
{:a _} :a0
{:a _ :b _} :ab0))
(defn y [m]
(match m
{:a _ :b _} :ab0
{:a _} :a0))

我想匹配{:a 1 :b 2}

(x {:a 1 :b 2})
;=> :a0
(y {:a 1 :b 2})
;=> :ab0

函数y已为给定映射生成预期结果。

诚然,我可能不明白算法是如何工作的,但我的印象是,clojure.core.match会以某种方式发现{:a _ :b _}{:a _}更具体,因此会先尝试。

这就是为什么我很惊讶地看到匹配子句的顺序似乎很重要。

为什么会这样或我做错了什么?

比赛计算模式得分的方式无法从{:a _ :b _}中辨别出{:a _},而这很可能是应该的。相反,您可以做的是明确地告诉它地图中没有:b。

(m/match [{:a 1 :b 2}]
[({:a _} :only [:a])] :a0
[{:a _ :b _}] :ab0)

最新更新