1

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

(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 _},因此会先尝试。

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

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

4

1 回答 1

1

匹配计算模式分数的方式无法辨别{:a _}{:a _ :b _}它可能应该。相反,您可以做的是明确告诉它地图中没有 :b 。

(m/match [{:a 1 :b 2}]
         [({:a _} :only [:a])] :a0
         [{:a _ :b _}] :ab0)
于 2020-06-15T11:03:04.847 回答