功能和产品类型特点

时间:2017-06-23 06:53:42

标签: vdm-sl

类型之间有什么区别

(seq of nat * seq of nat) -> nat

seq of nat * seq of nat -> nat

根据语言参考手册*的优先级高于->,因此括号不起作用;在语义上是相同的。但请考虑函数定义

length: (seq of nat * seq of nat) -> nat
length (mk_(l,m)) == len l + len m;

length0: seq of nat * seq of nat -> nat
length0 (l,m) == len l + len m;

每个使用其中一种类型,定义中使用的模式必须与传递类型检查不同。看来这两种类型之间存在差异。这里发生了什么?通过括号,它将参数解释为产品,但没有括号,有两个参数,但不知何故,函数的参数类型仍然是一个产品。这很令人困惑。有人可以澄清吗?

1 个答案:

答案 0 :(得分:0)

是的,这很令人困惑。实际上,括号在这里用于两个目的,并且在语法中没有明确说明。在单独的情况下,可以在类型声明中使用括号来指示分组并克服默认优先级。这是你所期望的。但在函数定义中,顶级括号和星号也用于标识单独的参数类型。

所以“nat * nat - > nat”试图表明这是一个带有两个参数的函数,而不是这个函数只接受一个产品类型的参数。那么你怎么能表明你真的想要一个单一的产品论点呢?答案:括号: - )

因此,函数定义中最外层的包围和乘积运算符用于对参数类型进行分组,但更深的括号和星号具有通常的含义。当语法表示参数/返回类型是“函数类型”时语法是误导性的 - 语法上这是真的,但是然后解释类型的方式是特殊的,以便为函数提取参数号和类型。