类型之间有什么区别
(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;
每个使用其中一种类型,定义中使用的模式必须与传递类型检查不同。看来这两种类型之间存在差异。这里发生了什么?通过括号,它将参数解释为产品,但没有括号,有两个参数,但不知何故,函数的参数类型仍然是一个产品。这很令人困惑。有人可以澄清吗?
答案 0 :(得分:0)
是的,这很令人困惑。实际上,括号在这里用于两个目的,并且在语法中没有明确说明。在单独的情况下,可以在类型声明中使用括号来指示分组并克服默认优先级。这是你所期望的。但在函数定义中,顶级括号和星号也用于标识单独的参数类型。
所以“nat * nat - > nat”试图表明这是一个带有两个参数的函数,而不是这个函数只接受一个产品类型的参数。那么你怎么能表明你真的想要一个单一的产品论点呢?答案:括号: - )
因此,函数定义中最外层的包围和乘积运算符用于对参数类型进行分组,但更深的括号和星号具有通常的含义。当语法表示参数/返回类型是“函数类型”时语法是误导性的 - 语法上这是真的,但是然后解释类型的方式是特殊的,以便为函数提取参数号和类型。