core.typed 是一个有趣的项目:它试图给 duck type 的 clojure 语言加上一个可选的类型系统。这个类型系统与 Haskell 语言的类型有些相似,比 Java/C++ 等语言的类型系统要强大得多:毕竟 Clojure 是一个函数式语言。例如:
my-str :- (t/Nilable String)
可以是 nil 或者一个字符串。 (map f my-seq)
这个表达式中,如果 f 是这个函数:(t/fn [a :- Num] :- Num (inc a))
(类型是一个单一数字参数返回值是数字的函数),那么它会检查 my-seq 是否每个元素都是数字。 如此强大的类型系统当然会对有些过于灵活的 Clojure 提供了更多的吸引力:对于大型项目,能够进行更多的编译时检查似乎总比全部依赖测试来得更令人放心。何况,它还是可选的层次,你大可以先快速书写没有类型的程序,然后在完成部分代码(比如一个 namespace 后)再加上类型信息,让 core.typed 的编译检查来帮忙。
可惜,试用了 core.typed 的当前版本 0.2.68 后,发现它离一个强悍的工具还有些距离:
试用几个小时后,我将 core.typed 依赖从 project.clj 里拿掉了,目前看来用更齐备的单元测试来检查更实用些。可能我会尝试加入 schema 来试验下运行时类型检查。
如果 core.typed 将成为重要的工具,估计需要合并进 clojure.core,毕竟核心的支持会让更多人研究它,会让更多库支持它。不过除非 Rich Hickey 对类型系统的价值有新的判断,这步工作不一定会成为现实。而如果这个决定做出,显然会让 clojure 进入 2.x 时代。