以视频分析为主要载体的人工智能算法在泛安防场景中是怎样落地的?>> 了解详情
写点什么

Core.Typed 为 Clojure 添加了可选的类型系统

  • 2013 年 10 月 18 日
  • 本文字数:1678 字

    阅读完需:约 6 分钟

Core.typed 向动态类型 Clojure 中添加了一个可选的类型系统。它的目标是做到两全其美:即具有 Clojure 的简洁性和灵活性又能获得类型检查语言所具有的安全保证。因为这个类型系统是可选的,所以你可以在它能够提供最大价值的地方逐步地使用它。 core.typed 的用户手册中提到:

如果给类型加上合适的文档说明,那么它就是一个非常好的机器可检查的文档。它们永远都不会过时并且通常是非常重要的,因为它能够快速地提醒用户函数的功能。

在程序发展的时候类型化是有用的,特别是有多个贡献者的时候。如果一个贡献通过了类型系统,我们就知道它是类型正确的(类型错误几乎是最常见的用户编程错误)。

Core.typed 能够通过类型推理功能自动地为你指出很多类型,var 变量、函数参数和一些宏需要显式的类型注解,你还能够注解协议和数据类型。例如,一个求和函数的注解可能是这样的:

复制代码
(ann add [Number Number -> Number])
(defn add [a b]
(+ a b))

因为类型声明和实现是分离的,所以你能够很容易地向第三方代码中添加类型注解,就像 clojure.core 这里所实现的那样。

core.typed 的作者 Ambrose Bonnaire-Sergeant 说,当前的0.2 版本已经做好了产品化的准备,这意味着它“能够找到真实代码中的bug,并且不会让你已有的代码慢下来”。API 现在也应该稳定了。

InfoQ 与 Ambrose 进行了一次谈话以便于了解他是如何开始 core.typed 的:

该项目开始是我在西澳大利亚大学计算机科学学士的本科荣誉项目。我受到了 Sam Tobin-Hochstadt 类型化 Racket 的启发,它也是类型化 Clojure 内部很多理论和实现的源泉【编辑注释:类型化 Clojure 是 core.typed 之前的名称】。

InfoQ: 谈到验证,在 core.typed 中有很多单元测试。你还正式地验证你的类型检测器吗?(我假定 core.typed 使用了 core.typed?)

我相信所有的项目都将从验证技术的结合中受益。Core.typed 主要使用了单元测试验证,但是我也已经开始了类型检查实现。类型检测器具有广泛的适应性,它甚至能够静态地验证与使用其他验证技术相关的属性。例如,如果 core.typed 和 Prismatic 架构互相了解,那么 core.typed 就能够检查你的运行时测试架构是否能够充分地避免类型错误。

类型化 Clojure 在 _ 编译时 _ 能够检查的一些更加有趣的属性包括没有空指针异常正确的 Java 互操作不可变绑定的正确使用

具备良好测试覆盖率的类型检查代码体在寻找 bug 的时候并不是必须的,但是我发现将无类型代码转换成有类型代码的过程类似于代码审查。

InfoQ: 对于 Scala 程序员而言,有一些类型名称可能看起来很熟悉。Scala 也具有局部类型推理,那么 Scala 对 core.typed 有什么影响么?类型系统能够很好地测量出代码的复杂度:如果你的类型是巨大且凌乱的,那么可能有重构的机会。因为凌乱的类型通常意味着凌乱的逻辑。

确实有一些影响。类型化 Clojure 接口能够和 Java 代码友好相处,比较一下 Scala 是如何处理 Java 类型系统中的一些怪癖是非常有用的,例如数组协变和空指针。

还有一点点嫉妒 Scala:Odersky 的彩色局部类型推理(Colored Local Type Inference)就是局部类型推理的一个非常好的扩展,它允许 Scala 程序员省略某些注解。类型化 Clojure 和类型化 Racket 使用了另一种方式扩展局部类型推理,但是我们总是关注于使用像彩色局部类型推理这样的扩展去避免某些不必要的注解

InfoQ: Clojure 社区的反馈如何?

对于社区的反应我一直都非常高兴。我认为这表明 Clojure 程序员在构建 Clojure 程序的时候一直都在渴望一个强大的、完全可选的类型系统。

InfoQ: 你下一个版本的计划是什么?

作为全职类型化 Clojure 开发集资项目的一部分,我已经列举了我接下来的计划。

我希望尽快完成的变化包括:支持将 Clojurescript 作为类型检查的目标,能够基于静态类型生成运行时契约,实现自托管的 Clojure 编译器并推出类型化 Clojure 能够满足的边界

如果想进一步地了解与 core.typed 相关的信息,那么可以访问项目网站,或者看看这个工作室记录。如果你喜欢core.typed,不要忘记支持Ambrose 的 资金募集计划

查看英文原文 Core.Typed Adds an Optional Type System to Clojure

2013 年 10 月 18 日 02:201026
用户头像

发布了 321 篇内容, 共 106.5 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

以太坊的黄金时代:模块化的区块链范式的开端

CECBC区块链专委会

自动驾驶混战,剑气二宗谁能笑傲江湖?

脑极体

认识流媒体协议,从 RTSP 协议解析开始!

声网Agora

协议 RTSP

代码检查规则:Java语言案例详解

百度开发者中心

Java 最佳实践 案例分享 代码检查规则

阿里P8最全总结PDF:Tomcat+虚拟机+Spring全家桶+MyBatis源码等

Java 架构 面试 程序人生 编程语言

MyBatis 批量插入数据的 3 种方法!

王磊

Java mybatis springboot

使用 Ansible 部署 Elasticsearch 集群

Se7en

分享一套golang实现的 IM 系统,一键部署服务端,客户端SDK全平台支持,可以替代IM云服务

OpenIM

都2021年了,还在算法上折跟头?这本《字节跳动面试必问算法秘籍》送给你!

Java 架构 面试 程序人生 编程语言

还在郁郁寡欢?啃完666页Java面试高频宝典,十月保你定级腾讯T3-2

Java 架构 面试 程序人生 编程语言

自我提升:高效能人士的 7 个习惯学习笔记(二)

程序员架构进阶

效率 自我管理 自我提升 10月日更

看山聊 Java:检查日期字符串是否合法

看山

Java 10月日更

私有分布式账本技术还是公共区块链?

CECBC区块链专委会

软件架构思考

轻口味

android 架构设计原则 10月日更

内网域渗透分析(实战总结)

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

偷瞄大佬书签栏,16个C++必备学习网站,建议收藏

奔着腾讯去

c++

接棒运动赛事!工厂里也有热血竞技?

白洞计划

机器人自主学习新进展,百度飞桨发布四足机器人控制强化学习新算法

百度大脑

人工智能 飞桨

引航计划|大前端|优质合集手把手带你玩转移动开发

三掌柜

前端 引航计划 引航 大前端领域

看完阿里大牛的数据结构学习笔记,我直接手撕了500道Leetcode题

Java 程序员 架构 面试 算法

新一代容器平台ACK Anywhere,来了

阿里巴巴中间件

阿里云 云原生 中间件 ACK ACK Anywhere

虚拟化管理软件比较(Eucalyptus, OpenNebula, OpenStack, OpenQRM,XenServer, Oracle VM, CloudStack,ConVirt)

hanaper

“区块链+农业”推动产业“提档升级”

CECBC区块链专委会

如何区分封闭图形的内部和外部

Changing Lin

10月日更

重置不良的编程陋习

devpoint

编码习惯 10月日更

架构实战营模块九作业 - 毕业设计

王晓宇

架构实战营

Serverless 工程实践 | Serverless 应用优化与调试秘诀

阿里巴巴云原生

阿里云 Serverless 云原生

记不住源码?掌握这套方法,Alibaba必有你一席之地!

Java 架构 面试 程序人生 编程语言

Hold the Door!区块链底层平台流控分析

趣链科技

区块链 流量控制 底层平台

引航计划|大前端|优质合集手把手带你玩转 JS

三掌柜

引航计划 引航 大前端领域 官方优质合集

用时三个月,阿里P8大佬总结出来的最深《Java性能优化全攻略》限时分享!

Java 架构 面试 程序人生 编程语言

Core.Typed 为Clojure添加了可选的类型系统-InfoQ