2024 年 Clojure 状态调查 中分享您的想法!

欢迎!请参阅 关于页面 了解更多信息。

0 投票
core.typed
如何重现


(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}]

1 答案

0 投票
参考:https://clojure.atlassian.net/browse/CTYP-222(由 alex+import 报告)
...