编程语言中的“缺失”(?)功能?

时间:2015-04-06 13:10:51

标签: haskell types language-design type-systems

让我们以Haskell为例,因为它最接近我将要描述的语言。

例如,类型Int可以被视为所有可能值(该类型)的集合。 为什么我们只能使用非常具体的设置呢? IntDouble等等,而不是类型系统中的所有子集。

我希望我们能够定义像Int greater than 5这样的任意类型的语言。有这样的语言的例子吗?如果没有,为什么不呢?

3 个答案:

答案 0 :(得分:8)

您正在寻找Dependent types。 Idris,Agda和Coq在这一类别中是众所周知的。

答案 1 :(得分:2)

实际上你可以在Haskell中定义它,因为它基本上是Int加上一些语义。例如,您必须决定在低于阈值的减法时使用什么,例如(-) 6 7给出的减法。 (Peano算法的一个常见约定是给0 - 所以在这种情况下它将返回6,即系统的最小值。)你还需要选择是否要去{{1在error上,或者您是否要存储,例如fromInteger 3而不是newtype IntGT5 = IntGT5 (Maybe Int)。您必须自己编写所有类型类实例,并且一旦完成,您将拥有合适的类型。

如果您对这个问题有持久的兴趣,需要注意的两件事是liquid typessubtyping。让我告诉你一些关于后者的事。

Alan Kay发明了OOP与它不同的东西(他希望每个程序都被编写为通信计算机网络),但它在现代世界中的结果基本上是一种复杂的子类型的方式。 "鸭子打字",例如,关于创建一个"交叉类型"一堆非常普遍的类型(比如`带有&#34的东西; waddle"方法,有" quack"方法的东西),其他类型是其子类型。所以子类型很自然是OOP。

我与你联系的论文指出了另一个关于子类型的有趣的事情:你可以使用子类型来消除类型和值之间的区别。当然,将类型转换为值不需要子类型;它是例如已经是Python语言中的情况,您可以在其中调用newtype IntGT5 = IntGT5 Int来获取表示对象类型的对象。但有趣的是,随着子类型的出现,您可以定义类型type(x)3 :: Int3)类型,它是所有Int的类型到Int。它本质上是一个单元/ void类型,它是更大类的子类型。通过模糊类型3的{​​{1}}和类型3的{​​{1}}之间的区别,您可以获得每个值。然后,您可以使用此方法执行类似JSON的操作,其中Int是一种包含两个属性3Int的对象,其中{x: Int, y: 3 :: Int}是任意x y是整数x

答案 2 :(得分:0)

Ada language支持范围数字类型。我不能真正地对这种语言进行智能评论,但我已经被那些知道它的人理解,范围检查是由编译器插入的运行时检查强制执行的。

关系数据库理论也有与之相关的概念。属性可以采用的值集是domain,它是其数据类型和constraints的函数。但是,实际的RDBMS通常不会完全实现这些概念。

依赖类型是一种更通用的系统,可以编码这种约束,还有许多其他约束。我依赖类型的胶囊解释是这样的:它们是一种设计包含证明作为第一类值的编程语言的方法。证明是一种价值,凭借其存在及其遵守的规则,保证了命题的真实性(a.k.a。“句子”,“陈述”等)。

因此,在依赖类型下,您可以使用x > 5类型,其值为x大于5的证明。如果你有这种类型的实际值,那么x大于5是真的,因此这个证明在范围内的代码可以在该假设下安全地进行。您可以使用相关和类型将数字和校样打包在一起,我们可以将其标记为∃x : Int. x > 5,其值为,以便:

  1. 第一个元素是整数x
  2. 第二个元素是x > 5
  3. 的证明