我正在寻找关于类型系统的良好介绍,
它们基于合同/约束
(抱歉,我不记得哪个术语适用于类型系统)。
我需要这些信息才能实现这种实验型系统。
据我所知,此类型系统用于 XSD (Xml架构定义)。
不是定义数据类型,而是定义可能值集的约束。
我使用参数定义了一些方法,该参数可以是"nothing"
,也可以与整数范围[0..100]
匹配。
此方法可接受以下值:
"nothing"
0
1
...
100
我希望,我能清楚自己。
答案 0 :(得分:2)
答案 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编译器发出更适合操作数类型的代码,但上面的例子更像是编写运行时类型检查的简洁方法。