如何重现
(t/cf (t/fn [m :- (t/HMap :optional {:a String} :complete? true)] (if-let [b (get m :a)] true)))
观察到的结果
[[(t/HMap :optional {:a String} :complete? true) -> true :filters {:then tt, :else ff}] {:then tt, :else ff}]
期望的结果 (伪代码)
[(t/HMap :optional {:a String} :complete? true) -> (t/U nil true)]
如果您将上面的 if-let 替换为 if,则会得到如下结果:
返回类型应该是 (t/Option true),因为如果 map 上没有设置 :a 键,则 if-let 将导致 nil 返回。
详细资料
broz@macmicro:~$ grep try ~/.lein/profiles.clj
[lein-try "0.4.3"]
broz@macmicro:~$ lein try org.clojure/core.typed
nREPL 服务器已在端口 52406 上启动,主机 127.0.0.1 - nrepl://127.0.0.1:52406
REPL-y 0.3.5,nREPL 0.2.6
Clojure 1.6.0
Java HotSpot(TM) 64 位服务器 VM 1.8.0_40-b26
文档:(doc function-name-here)
(find-doc "part-of-name-here")
源:(source function-name-here)
Javadoc:(javadoc java-object-or-class-here)
退出:Ctrl+D 或 (exit) 或 (quit)
结果:存储在 *1, *2, *3, 以及 *e 中的异常
user=> (require ['clojure.core.typed :as 't])
nil
user=> (t/cf (t/fn [m :- (t/HMap :optional {:a String} :complete? true)] (if-let [b (get m :a)] true)))
初始化 core.typed ...
构建 core.typed 基础环境 ...
完成构建基础环境
"已用时间:14055.732654 毫秒"
core.typed 已初始化。
[[(t/HMap :optional {:a String} :complete? true) -> true :filters {:then tt, :else ff}] {:then tt, :else ff}]