11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

Racket 6.11 提供了稳定的细化类型和依赖函数特性

  • 2017-11-16
  • 本文字数:1088 字

    阅读完需:约 4 分钟

Typed Racket 是 Racket 语言的一种静态类型方言。 Racket 6.11 为 Typed Racket 提供了细化类型(Refinement Type)和依赖函数(Dependent Function)特性。

细化类型是一种关联了谓词(Predicate)的类型,所关联的谓词对于该类型的任一成员都成立。表述细化类型的通用语法是(Refine [v : t] p),定义了所有类型为 t 的值 v 满足谓词 p。

下面的函数给出了一个细化类型的基本例子,该函数确保了函数的返回值至少不小于每个输入值:

(-> ([x : Integer] [y : Integer]) (Refine [z : Integer] (and (>= z x) (>= z y))))在 Racket 中,也可以设置细化谓词(Refinement Predicate)为一些程序条件(Term),使得细化类型依赖于这些条件的值。例如,下面定义的细化类型中,只包括整数 42:

> (ann 42 (Refine [n : Integer] (<= n 42)))依赖函数类型(Dependent Function Type)使用类似于细化类型的语法,指定了函数参数间的依赖关系,或参数与函数范围间的依赖关系。在依赖类型中,不允许存在循环依赖关系。例如,下面定义的函数,可在不越界条件的情况下访问向量中的成员:

复制代码
(: safe-ref1 (All (A) (-> ([v : (Vectorof A)]
[n : (v) (Refine [i : Natural]
(< i (vector-length v)))])
A)))

当然,在函数签名中定义先决条件(Precondition)也可以达到同样的效果:

复制代码
(: safe-ref2 (All (A) (-> ([v : (Vectorof A)]
[n : Natural])
#:pre (v n) (< n (vector-length v))
A)))

Typed Racket 的创立者和维护者 Sam Tobin-Hochstadt 在 InfoQ 的访谈中,对此给出了如下解释:

依赖类型特性使 Typed Racket 可以检查程序的属性,这是几乎所有其它的语言都做不到的。我们正使用这些新信息,探索可能对程序做出的这类改进。希望使用 Typed Racket 中的细化类型和依赖类型,能给出更快、更可靠的软件。

在前期版本的 Racket 中,细化类型和依赖函数是以实验性特性提供的,现在已是默认提供。为获得最新的修复,建议用户定期更新到快照构建(snapshot build)。如果用户想要进一步了解Racket 6.11 中依赖类型的使用信息,一定要看一下 Andrew Kent 给出的介绍。正是 Kent 在 Tobin-Hochstadt 的指导下完成了这些特性的主要工作。

依赖类型是类型系统中的一个特性,它允许创建更具表达力的类型,以在编译时捕获更多软件缺陷。其它支持依赖类型的语言有 Idris、Coq 和 F*。同时, Haskell 对依赖类型的支持也在推进中

查看英文原文: Refinement Types and Dependent Functions Stable in Racket 6.11

2017-11-16 18:006231
用户头像

发布了 390 篇内容, 共 112.6 次阅读, 收获喜欢 251 次。

关注

评论

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

星环科技AIoT平台让工业制造设备更智能、更耐用

星环科技

有关 TiDB 升级的二三事——教你如何快乐升级

PingCAP

【有奖评测】无影云电脑评测征集令,晒出评测赢万元豪礼

阿里云弹性计算

阿里云 无影云电脑 征文活动

java开发之SpringBoot实现自动执行代码

@零度

JAVA开发 springboot

【分布式技术专题】「Zookeeper系列」为大家介绍一下 Zookeeper 的"开发伴侣"—Curator-Framework(组件篇)

洛神灬殇

zookeeper ZooKeeper原理 1月月更 Curator-Framework

TcaplusDB君 · 行业新闻汇编(五)

TcaplusDB

腾讯云TcaplusDB助力国内首个虚拟音乐嘉年华 TMELAND,万人一起跨年!

TcaplusDB

今儿新学会一个写日志技能:双缓冲机制

华为云开发者联盟

线程 日志 应用程序 双缓冲区 Web程序

【分布式技术专题】「Zookeeper系列」为大家介绍一下Zookeeper的"开发伴侣"—Curator-Framework(基础篇)

洛神灬殇

zookeeper curator 1月月更 CuratorFramework

【TcaplusDB知识库】TDR表GOSDK示例代码-查询数据

TcaplusDB

使用 Visual Studio Code 编写和激活 ABAP 代码

Jerry Wang

vscode abap 1月月更 vs-code

不会一致性hash算法,劝你简历别写搞过负载均衡

程序员小富

Java 面试 算法 架构设计 一致性算法

大数据实践:数据指标中心的建设思路

五分钟学大数据

大数据 1月月更

大数据开发之Spark SQL 的 Catalyst介绍

@零度

大数据 spark SQL

rosdep update遇到ERROR: error loading sources list: The read operation timed out问题

Ayosh

ROS

Apache 基金会年度报告 | ShardingSphere 代码提交量位列前十

SphereEx

数据库 开源 基金会 ShardingSphere SphereEx

Android技术分享| Android WebRTC 对 AudioRecord 的使用

anyRTC开发者

android 音视频 WebRTC 移动开发 AudioRecord

前端开发之jQuery的常用方法

@零度

jquery 前端开发

【伙伴故事】智慧厨电接入华为云+HarmonyOS,你的未来厨房长这样

华为云开发者联盟

华为云 HarmonyOS iotda 智慧厨电 厨房

12月发布两大特别专区!一图了解龙蜥社区大事件

OpenAnolis小助手

开源 操作系统 运营

澳鹏中国智能可配置工作流(Workflow 2.0)全新升级

澳鹏Appen

人工智能 工作流 workflow 数据标注 训练数据

盘点 2022 云原生实战峰会重磅发布

阿里巴巴云原生

阿里云 开源 容器 云原生

TcaplusDB君 · 行业新闻汇编(一)

TcaplusDB

TcaplusDB君 · 行业新闻汇编(四)

TcaplusDB

TcaplusDB君 · 行业新闻汇编(三)

TcaplusDB

MASA Framework - 整体设计思路

MASA技术团队

C# .net 框架 Framework dapr

极客星球 | MobPush之FCM离线消息解密

MobTech袤博科技

FCM 离线消息

TcaplusDB君 · 行业新闻汇编(二)

TcaplusDB

main函数你到底知道多少

恒生LIGHT云社区

后端 开发 Java’ main方法

Racket 6.11提供了稳定的细化类型和依赖函数特性_函数式编程_Sergio De Simone_InfoQ精选文章