当地定义:出租和何处

在Agda中声明本地定义有两种方式:

  • let表达式
  • 其中块

let表达式

let-expression定义缩写。换句话说,我们在let-expression中定义的表达式既不能是递归的,也不能由模式匹配定义。

示例:

(f) :国家(f)= 小时:国家国家小时分钟=苏克(例如)
    在里面h零+h(真空零点)

让表达式具有一般形式

(f):A₁AₙA类f x₁…xₙ=e(电子)在里面e’

排版后,这只是一个替换e’[f := λ xₙ 电子].由于阿格达替补客场比赛的替补,他们并没有出现在比赛中Agda打印,也不会在交互式模式下显示目标。

其中块

其中blocks比let-expressions强大得多,因为它们支持任意本地定义。A类哪里可以附加到任何函数子句。

其中块具有一般形式

条款哪里下降

条款模块 M(M) 哪里下降

一个简单的例子是

每秒克=e(电子)哪里
  (f) :A₁AₙA类f p₁…pₙ=ef pₘ₁…pₙ=e

这里pᵢⱼ是相应类型的模式eᵢ是一个表达式,可以包含(f).用where-expression定义的函数必须遵循模式匹配的一般定义规则。

示例:

颠倒 : {A类: 设置} 列表A列表A颠倒{A类}X轴=修订附录xs[]哪里
  修订附录 :列表A列表A列表A修订附录[]年=修订附录(x|x)=修订附录xs(x|y)

变量范围

块所在的父子句的模式变量范围;在前面的示例中,这些是A类X轴. The父子句的类型签名绑定的变量不在中范围。这就是我们添加隐藏活页夹的原因{答}.

本地声明的范围

这个哪里-定义在以下子句之外不可见拥有这些定义(父子句)。如果哪里-块是给定名称(形式模块 M(M) 哪里),则定义如下经鉴定后可用M(M),自模块M(M)甚至可见在父子句之外。匿名模块的特殊形式(模块 _ 哪里)使定义在无限制的母条款。

如果命名的哪里-块(形式模块 M(M) 哪里)是私有的,然后是模块M(M)也是私有的.然而,里面的声明M(M)除非声明,否则不是私有的如此明确。因此,以下示例范围检查良好:

模块 母公司₁ 哪里
  私有的起源=地方的模块 私人 哪里地方的= 设置
  模块 公共 =私人测试₁=母公司₁.Public.local

同样,a私有的父函数的声明不影响根据模块 _ 哪里-块:

模块 父(R) 哪里
  私有的起源=地方的模块_哪里地方的= 设置测试⁄=父文件夹.local

他们可以申报私有的但要明确:

模块 母公司(3) 哪里起源=地方的模块_哪里
    私有的地方的= 设置

现在,母公司本地不在范围内。

A类私有的普通股的母公司声明哪里-当然,块对局部定义没有影响。它们甚至不在范围内。

正在验证属性

有时需要在关于父函数。在这种情况下模块 哪里变种更可取。

颠倒 : {A类: 设置} 列表A列表A颠倒{A类}X轴=修订附录xs[]模块 利润 哪里
   修订附录 :列表A列表A列表A修订附录[]年=修订附录(x个::X轴)=修订附录xs(x个::)

这使我们可以访问本地函数

修订版-附录 : {A类: 设置} (xs公司:列表A) 列表A列表A列表A

或者,我们可以定义局部对我们正在使用的模块具有专用功能;因此,他们在导入此模块的任何模块中都不可见,但它将让我们证明它们的一些性质。

私有的
   修订附录 : {A类: 设置} 列表A列表A列表A修订附录[]年=修订附录(x|x)=修订附录xs(x|y)

反向' : {A类: 设置} 列表A列表A反向'xs=修订附录xs[]

更多示例(针对初学者)

使用let-expression

tw-map(tw-map) : {A类: 设置} 列表A列表(列表A)tw-map(tw-map){A类}X轴= 两次:列表A列表A两次xs=xs++xs在里面地图(\x个两次[x])X轴

定义相同,但类型信息较少

tw-map(tw-map) : {A类: 设置} 列表A列表(列表A)tw-map(tw-map){A类}X轴= 两次:_两次xs=xs++xs在里面地图(\x个两次[x])X轴

定义相同,但带有where-expression

tw-map“” : {A类: 设置} 列表A列表(列表A)tw-map“”{A类}X轴=地图(\x两次[x])X轴哪里两次:列表A列表A两次xs=xs++xs

使用let的类型信息更少

(f) :国家列表Natf零=[零](f)(例如) = =[例如]在里面唱++f n

使用where的相同定义

f’ :国家列表Natf'零=[零]f’(例如) =唱++f’n哪里=[例如]

一个let中有多个定义:

小时 :国家国家小时n= 添加2:国家添加2=苏克(例如)

          两次 :国家国家2倍m=米*米在里面两次加法2

中有多个定义,其中:

 :国家国家希腊=fib n+事实n哪里小谎:国家国家fib零=真空零点小谎(真空零点) =真空零点小谎(苏克(例如)) =小谎(例如)+纤维蛋白n事实 :国家国家事实为零=真空零点事实(例如) =suc n*事实n

结合let和where:

k个 :国家国家千牛顿= 辅助的:国家国家辅助m=pred(前)(克/米)+小时分钟在里面辅助的(前n)
  哪里pred(前):国家国家预调零=pred(前)(例如) =