关于core.typed
关于关键字参数的wiki,我想出了以下代码段来测试它。我不知道为什么我会收到以下错误。
(ns typeddemo
(:require [clojure.core.typed :as t]))
(t/ann testfn (Fn [Any & :mandatory {:a t/Num :b t/Num} -> t/Num]
[Any & :optional {:a t/Num :b t/Num} -> t/Str]))
(defn testfn
[y & {:keys [a b]}]
(if (and (number? a) (number? b))
(+ a b)
"Missing b"))
(testfn 55 :a 5 :b 6)
Static method clojure.lang.Numbers/add could not be applied to arguments:
Domains:
java.lang.Long java.lang.Long
java.lang.Double java.lang.Double
t/AnyInteger t/AnyInteger
java.lang.Number java.lang.Number
Arguments:
(t/U Number nil) Number
Ranges:
java.lang.Long
java.lang.Double
t/AnyInteger
java.lang.Number
with expected type:
t/Str
in: (clojure.lang.Numbers/add a b)
我原以为core.typed
可以推断当测试(and (number? a) (number? b))
通过时,两个参数必须都是t/Num
,因此结果也应该是t/Num
。仅在测试失败时,类型为t/Str
。为什么声称add
功能不适用。在条件允许的情况下,参数如何成为(t/U Number nil) Number
?