核心.typed关键字参数的实际示例

时间:2015-03-07 00:31:38

标签: clojure clojure-core.typed

关于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

0 个答案:

没有答案