Following code passes a type check as expected:
(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)))
However, if I unwrap the {{typed/fn}}, it does not pass a type check:
(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)))
Type Error (sicp/ch_4.clj:353:3) Expected result with filter {:then (is (U String Number) exp__#0), :else (! (U String Number) exp__#0)}, got filter {: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))