2024年 Clojure 调查问卷中分享您的想法!

欢迎!请参阅关于页面,了解更多有关如何使用本站的信息。

0投票
core.match
我对{{core.match}}非常新手,刚刚开始玩。 在此过程中,我有一个这样的示例


(for [x [[1 2 3]
     [1 2 3 4]
     {:a 17, :b 2}
     {:a 23, :b 7}]]
  (match [x]
   [[a b c]]                    [a b c]
   [{:a a, :b 2}]                    {:a a}
   [{:a (a :guard odd?), :b b}] {:a a, :b b}
   :else                        :no-match))


它报错,信息是??"IllegalArgumentException 参数必须是整数::clojure.core.match/not-found clojure.core/even? core.clj:1351)"??. 问题在于将关键字{{:clojure.core.match/not-found}}传递给{{:guard}}函数{{odd?}},它将其传递给{{even?}}。

我可以通过确保我的guard只接受整数来修复它


(for [x [[1 2]
     [1 2 3]
     [1 2 3 4]
     {:a 17, :b 2}
     {:a 23, :b 7}]]
  (match [x]
   [[a b c]]                               [a b c]
   [{:a a, :b 2}]                          {:a a}
   [{:a (a :guard #(and (integer? %)
                        (odd? %))), :b b}] {:a a, :b b}
   :else                                  :no-match))


但是,guard为什么必须处理{{:clojure.core.match/not-found?}} 是否具有意义?在我看来,上面的例子中所有匹配的映射值都是整数,因此似乎我可以有一个只接受整数的guard。

2 答案

0投票

评论者:tsdh

您实际上可以使用像{{:clojure.core.match/not-found}}这样的特殊值来制作一种扭曲的映射模式,它只在没有匹配时才会匹配,如下所示。

(match [{:a 1}] [{:b (a :guard #(identical? % :clojure.core.match/not-found))}] :yes :else :no) ;=> yes

但我猜(并希望)没有人会依赖这种奇怪的行为。

0投票
...