美丽的远景

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 后,发现它离一个强悍的工具还有些距离:

  • 它本身实现有些 bug 。如错误信息,经常让人摸不到头脑。
  • 支持 core.typed 的类型定义的库极少。它自带了 clojure.core 等核心库的类型定义,但还有很多缺失:如 clojure 1.7.0-alpha1 的新 transducer 支持。
  • 类型推断系统还不够聪明,做不到 Haskell 的水平。

未来

试用几个小时后,我将 core.typed 依赖从 project.clj 里拿掉了,目前看来用更齐备的单元测试来检查更实用些。可能我会尝试加入 schema 来试验下运行时类型检查。

如果 core.typed 将成为重要的工具,估计需要合并进 clojure.core,毕竟核心的支持会让更多人研究它,会让更多库支持它。不过除非 Rich Hickey 对类型系统的价值有新的判断,这步工作不一定会成为现实。而如果这个决定做出,显然会让 clojure 进入 2.x 时代。


robertluo
738 声望21 粉丝

引用和评论

0 条评论