摘要定义

定义可以标记为抽象,以便隐藏实现细节,或加快其他部件的类型检查。本质上,抽象定义的行为类似于假设,因此,不减少/计算。例如,内容无关紧要的证明可以标记为抽象,以防止Agda展开它们(这可能会减缓类型检查)。

作为指导原则摘要旨在防止抽象的实现细节泄漏定义。其他编程语言的类似概念包括(非代表性样品):UCSD Pascal和Java的接口以及ML的签名。(特别是当抽象定义与模块结合使用时。)

剧情简介

  • 可以使用block关键字将声明标记为抽象摘要.
  • 在抽象块之外,抽象定义不会减少,它们被视为假设,特别地:
    • 抽象函数永远不会匹配,因此,不会减少。
    • 抽象数据类型不公开其构造函数。
    • 抽象记录类型不公开其字段或构造函数。
    • 其他声明不能是抽象的。
  • 在抽象块内部,抽象定义减少,而类型检查定义,但在检查其类型签名时没有。否则,由于依赖类型,可能会泄漏实现细节(例如,通过使用命题暴露约简行为平等)。
  • 内部私有的在中键入签名摘要块,抽象定义确实减少了。然而,这也存在一些问题。请参见问题#418.
  • The reach of the摘要关键字块递归扩展到这个哪里-函数的块和内部的声明记录声明,但不在抽象块。

示例

整数可以以多种方式实现,例如作为两个整数的差自然数:

模块 整数 哪里

  摘要=自然×自然0 :0= 0,0

    1 :1= 1,0

    _+ℤ_ : (x年:) (p、n)+(p',n') = (p+p'),(n+n’)

    -ℤ_ :-(p、n) = (n,p)

    _≡ℤ_ : (x年:)  设置
    (p、n)(p',n') = (p+n’)(p'+n型)

    私有的
      假设
        +通信 : n米 (n+m)(百万+百万)

    发票 : x个 (x个+(-x个))0发票(p、n) 重写+通信(电话+电话) 0 |+通信=回流

使用摘要我们不会透露整数,也不是操作的实现。我们可以建造他们来自0,1,_+ℤ_、和-,但唯一的原因是平等具有所提供的引理发票.

以下属性0字形整数0的将整数表示为对。因此,它被Agda拒绝:检查其类型签名时,项目 x个未能进行类型检查自从x个是抽象类型记住,摘要定义不在类型签名中展开,即使在一个抽象的方块!然而,如果我们成形-私人,抽象定义的展开已启用,并且我们成功:

--关于零整数表示的一个属性:

  摘要
    私有的
      0字形 :  (x个:) (是0:x≡0) 项目x≡项目x个0字形(p、n)回流重写+通信0 =回流

通过要求0字形对type-check保密,泄露表示细节被阻止。

抽象的范围

在子模块中,检查抽象定义时,父模块的抽象定义是透明的:

模块 M1级 哪里
  摘要x个= 0

  模块 平方米 哪里
    摘要
      x-is-0型 :x≡0x-is-0型=回流

因此,子模块可以查看其父模块。然而,父模块不能像这样看到子模块,兄弟模块也不能相互抽象定义。

The reach of the摘要关键字未扩展到模块中:

模块 起源 哪里
  摘要
    模块 儿童 哪里= 0x个= 0  --避免“无用的抽象”错误

  y为0 :儿童.y≡0y为0=回流

模块中的声明儿童不是抽象的!

带有where块的抽象定义

a中的定义哪里抽象定义块是抽象的也。这意味着,他们可以看穿他们的抽象叔叔:

模块 在哪里? 哪里
  摘要
    x个 :国家x个= 0
     :国家=x个哪里
      x≡y :x≡0x≡y=回流

在中键入签名哪里街区是私人的,所以可以键入缩写哪里抽象定义块:

模块 WherePrivate公司 哪里
  摘要
    x个 :国家x个=项目t吨哪里T型=自然×自然t吨 :T型t吨= 0,1
      第页 :项目t≡0第页=回流

注意,如果第页不是私有的,应用程序项目 t吨以其类型由于T型.

已命名哪里-模块不使其声明私有,因此如果替换,此示例将失败x个哪里通过模块 M(M) 哪里.