有关基于合同/约束的类型系统的良好信息?

时间:2009-11-12 23:20:54

标签: programming-languages types constraints contract language-theory

问题:

我正在寻找关于类型系统的良好介绍, 它们基于合同/约束
(抱歉,我不记得哪个术语适用于类型系统)

我需要这些信息才能实现这种实验型系统。

据我所知,此类型系统用于 XSD (Xml架构定义)。

不是定义数据类型,而是定义可能值集的约束。

实施例

我使用参数定义了一些方法,该参数可以是"nothing",也可以与整数范围[0..100]匹配。

此方法可接受以下值:

"nothing"
0
1
...
100

我希望,我能清楚自己。

3 个答案:

答案 0 :(得分:2)

您可以查看Haskell甚至Agda等语言。此外,Oleg还有很多很棒的资源。

答案 1 :(得分:1)

这不是我的专业领域,因此它可能不合适,但Microsoft Research有一个项目 Code Contracts ,它“提供了一种语言无关的方式来表达编码假设.NET程序。合同采用先决条件,后置条件和对象不变量的形式“。

答案 2 :(得分:1)

Common Lisp在运行时提供此类型测试。它有一个精心设计的类型系统,但它没有被使用,因为你可能习惯于静态类型的语言。宏check-type接受typespec,它可以是内置规范,也可以是宏deftype定义的规范。使用类型规范表达的约束是用宿主语言编写的谓词函数的约束,也就是说,您可以检查运行时的任何内容都可以作为构成新类型的条件。

考虑这个例子:

(defun is-nothing (val)
  (when (stringp val)
    (string= val "nothing")))

(deftype strange-range ()
  "A number between 0 and 100 inclusive, or the string \"nothing\"."
  '(or (integer 0 100)
       (satisfies is-nothing)))

定义了一个名为“strange-range”的类型。现在测试几个值:

CL-USER> (let ((n 0))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 100))
           (check-type n strange-range))
NIL
CL-USER> (let ((n "nothing"))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 101))
           (check-type n strange-range))

最后一个使用以下消息触发调试器:

The value of N should be of type STRANGE-RANGE.
The value is: 101
   [Condition of type SIMPLE-TYPE-ERROR]

这个引发了同样的结果:

CL-USER> (let ((n "something"))
           (check-type n strange-range))

可以用这种方式施加的约束是富有表现力的,但它们与Haskell或Scala等精细类型的语言系统不同。虽然类型定义可以哄骗Common Lisp编译器发出更适合操作数类型的代码,但上面的例子更像是编写运行时类型检查的简洁方法。