以下代码按预期通过类型检查
(ann self-evaluating?
[Any -> Boolean
:filters {:then (is (U String Number) 0)
:else (! (U String Number) 0)}])
(defn self-evaluating? [exp]
(let [impl (typed/fn [x :- Any]
(or (number? x)
(string? x)))]
(impl exp)))
然而,如果展开{{typed/fn}},它不会通过类型检查
(ann self-evaluating?
[Any -> Boolean
:filters {:then (is (U String Number) 0)
:else (! (U String Number) 0)}])
(defn self-evaluating? [exp]
(or (number? exp)
(string? exp)))
类型错误(sicp/ch_4.clj:353:3) 预期带有过滤器{:then (is (U String Number) exp__#0), :else (! (U String Number) exp__#0)}的结果,但得到带有过滤器{:then (& (| (is (U nil false) or__4238__auto____#0) (is Number exp__#0)) (| (! Number exp__#0) (! (U nil false) or__4238__auto____#0))), :else (& (| (is (U nil false) or__4238__auto____#0) (is Number exp__#0)) (| (! Number exp__#0) (! (U nil false) or__4238__auto____#0)))}的结果
in: (if or__4238__auto__ or__4238__auto__ (string? exp))