隐式参数

可以省略类型检查器可以找出的术语将其替换为_.如果类型检查器无法推断_它会报告一个错误。例如,对于多态标识函数

身份证件 : (A类: 设置) A类A类

第一个参数可以从第二个参数的类型中推断出来,所以我们可以写身份证件 _ 将恒等函数应用于.

我们甚至可以在没有第一个参数的情况下编写这个函数应用程序。在这种情况下,我们声明了一个隐式函数空间:

身份证件 : {A类: 设置} A类A类

然后我们可以使用符号身份证件 .

另一个例子:

_==_  : {A类: 设置} A类A类 设置
变电站 : {A类: 设置} (C:A类 设置) {x年:A类} x个==C x公司

注意第一个参数_==_保留为隐式。同样,我们可以省略隐式参数A类,x个,以及在中应用变电站.要显式给出隐式参数,请用花括号括起来。以下两个表达式等效:

x1个=subst C eq cx2个=变电站{_}C{_} {_}等式cx

值得注意的是,在应用程序的末尾还插入了隐式参数,如果类型需要。例如,在以下内容中,y1个第2年是等效的。

y1个 :==b条加拿大C b类y1个=子集C第2年 :==b条加拿大C b类第2年=子集C{_} {_}

隐式参数急切地插入到左侧,因此年3第4年是等效的。一个例外是没有给定类型签名,在这种情况下没有隐式参数插入。因此,在第5年只有隐含的A类的论点变电站.

第三年 : {x年:A类} x个==C x公司第三年=子集C第4年 : {x年:A类} x个==C x公司C年第4年{x个} {} =子集C{_} {_}第5年=子集C

也可以使用隐式参数编写lambda抽象。对于示例,给定身份证件 : (A) : 设置) A类 A类,我们可以用定义恒等函数隐式类型参数为

id’=λ{A类} 身份证A

隐式参数也可以通过名称引用,所以如果我们想给出表达式e(电子)显式用于没有给出值x个我们可以写

子集C{=e(电子)}等式cx

构造隐式函数空间时,可以省略隐式参数,所以下面的两个表达式都是有效的类型表达式{答 : 集合} A类 A类:

z1型=λ{A类}x个x个z2型=λxx个

这个(或对于所有人)函数类型的语法也有隐式变体:

 : ( {x个:A类} B类)是相同的as({x个:A类} B类)
 : ( {x个} B类)是相同的as({x个:_} B类)
 : ( {x年} B类)是相同的as( {x个}   {} B类)

对于函数空间何时可以隐式,没有任何限制。在内部,显式和隐式函数空间的处理方式相同。这意味着无法保证隐式参数会得到解决。当存在未解决的隐式参数时,类型检查器将给出一条错误消息,指示哪个应用程序包含未解决的论据。这种对隐含论点的自由态度的原因是将隐式论证的使用限制在我们保证的情况下这些问题的解决排除了实践中许多有用的案例。

元变量

统一