结构化数据验证的依赖类型

时间:2011-10-09 12:49:57

标签: haskell functional-programming ocaml type-systems dependent-type

首先,我真的不知道依赖类型有什么问题,为什么我们没有看到它们用现有语言实现实际编程,而不是发明所有类型的技巧(模式!)来绕过当前类型系统的局限性最多只有非常简单和有限的概括。

但我的问题是关于数据的依赖类型而不是程序,我们如何或可以将它们用于结构化数据验证? 像json或xml或任何类型的结构化数据这样的含义是否可以使用某些依赖类型系统有效地验证它们?

修改

我的意思是依赖类型,它是最宽泛的定义“依赖于价值的类型”,而不是那些定理证明者和CoC工作人员。我不知道他们,我不想走那条路,我不相信那些唯一的或“最终”的方式来获得体面的依赖类型。在FP中,编码人员每天以非常优雅,建设性的方式编写他们最复杂的逻辑,简单而且完全没有问题。我相信他们将拥有他们最终的“优雅”依赖打字。

然而,我的问题是关于纯数据,不像在代码中很多检查可能是不必要的,并且只能隐藏在程序流和逻辑中,甚至动态类型也可以正常工作。在数据中,当您想要检查某些文档的正确性并给出明确的错误消息时,情况并非如此。另一方面,当你必须处理极端依赖类型系统(CoC系列)中的“函数”时,数据没有复杂性问题。

2 个答案:

答案 0 :(得分:14)

您可能会对本文感兴趣: The Next 700 Data Description Languages (PDF),Kathleen Fisher,Yitzhak Mandelbaum和David Walker,2006年。

  

本文的主要目标是开始了解家庭   临时数据处理语言。我们这样做,就像兰丁所做的那样   开发用于定义,比较和的语义框架   在我们的领域中对比语言。这个语义框架围绕着   围绕数据描述演算的定义(DDC ^α)。这个   微积分使用来自依赖类型理论的类型来描述各种类型   特殊数据的形式:用于描述原子数据的基本类型   类型构造函数来描述更丰富的结构。我们展示了如何给予   通过将类型解释为解析来指向DDC ^α的指称语义   将外部表示(位)映射到数据结构的函数   在一个打字的lambda演算。更准确地说,这些解析器产生两者   外部数据和解析描述符的内部表示   这可以找出原始来源中的错误。

简而言之:是的,如果要静态编码有关数据的细粒度不变量,则必须使用依赖类型。它们比代数数据类型和GADT更具表现力,它们还允许表达它们和相关结构(例如无标记联合和标记产品的组合),能够以某种方式呈现数据描述的汇编语言,甚至如果面向用户的规范没有直接暴露术语依赖性。

然而,请注意,这种形式化的方法是以更陡峭的学习曲线和更高的前期复杂性为代价的,即使理论上它可以用更简单,更安全,更好的规范,操作工具等来回报。该领域的从业者往往会忽略所有那种类型的系统美,并依赖于不明确的替代品。由于指定模式很无聊而且人们看不到它们带来什么好处,因此XML正在失去JSON。是的,您可以稍后指定所采用的JSON API的静态结构(并且您可能需要依赖类型来执行此操作,因为复杂性很容易进入这样的演化而不是设计格式),但这只是很少用没有人关心它,使用它,理解它,更重要的是,维护它

(关于你的推特介绍的辅助方面:请继续前进并与ATSGuruAgda一起玩,它们是用于相对实用的编程。如果你想去frankenstein路线,还有SHE; Coq并非设计为“实用于软件开发”,但已知这种方式被滥用 - 我不会因为依赖而建议它打字编程,但这对于非常依赖的编程加上伴随的正确性证明是有益的 - 如果你想卖掉你的灵魂,那么即将推出F*。)

答案 1 :(得分:2)

我认为语言中依赖类型的主要问题是它使类型检查(更不用说类型推断)成为一个不可判定的问题。这意味着对于某些程序,编译器在被编译之前将被强制进入无限循环,只是评估类型。

如果类型检查器的行为可以简单直观,那么这不一定是交易破坏者。在编译时避免无限循环可能只是这种语言编程的另一部分,就像在运行时避免无限循环一样。

然而,有效添加的是编程的“编译时间层”,在与正常程序完全不同的模式下完成图灵完全计算。我相信这已经可以在一些语言中完成;我相信C ++模板元编程是Turing-complete,Scala的类型系统可以根据我读过的博客对SKI演算进行编码。

但实际编程这样的系统是可怕的。在具有良好类型系统的编程语言中,存在类型系统以使编程更容易;它强制执行不变量,当程序的某个部分的更改影响另一个程序时提醒我们,并提供有关如何使用库代码的文档(通常可以从名称和类型中很好地猜测Haskell函数的功能)。但是当您在类型系统中编程时,除非有人添加了元类型系统,否则您没有这方面的帮助。同样,这些实际存在于某些语言中(我相信Haskell和Scala都有类型 types 的概念),但它们的设计与系统元编程的关系不同于常规类型系统必须定期编程。

就个人而言,我正在等待,看看是否会开发出一种试图以可用的方式解决所有这些问题的语言。但是我不知道为什么这些东西还不存在;这是一个难以解决的难题!